云原生|kubernetes 你真的学废了吗---实战k8s 二(命令行创建各类资源)

简介: 云原生|kubernetes 你真的学废了吗---实战k8s 二(命令行创建各类资源)

前言:

kubernetes的资源种类非常多,但常用的也就十来种吧,比如,pod,service,configMap,serviceaccount,deployment,secret,statefulset,StorageClass等等,总的来说学习难度还是不大的。但创建资源的流程你真的知道吗?下面就来介绍一哈资源创建的标准流程吧。

一,

命令行和资源清单文件(通常也叫模板文件)的关系

命令行指的是kubectl 客户端命令,直接通过apiserver调用创建各类资源。命令行方式创建资源具有简单,快速的特点,但缺点也是很大的:命令执行完了,如果有问题,不好回溯,也基本是没有保存,很多细节方面的问题也无法通过命令行书写,比如,pod调度,node亲和性,pod亲和性 或者需要写的命令非常长。

资源清单文件是对资源的精细化描述,并且通常的资源清单文件是yaml格式文件,易读,易理解。但,也是有一个比较大的缺点:编写难度非常高。

那么,命令行其实是基础,就想象成一个房子的地基吧,可以快速的生成资源清单文件(命令行可以转换成资源清单文件),这样的话,先命令生成文件,然后在此文件基础上进行细节的修改就可以达到我们想要的功能啦(降低资源清单文件编写难度了)。

下面将会写一些示例,来说明一个科学的资源创建的流程。

二,

RC/RS和service资源的创建

创建一个pod,该pod使用nginx,能够对外提供服务。

(1)

命令行创建一个pod,此pod不运行,仅仅生成资源清单文件

--dry-run表示不实际运行pod,如果不加此参数将会有非常多的冗余信息,-o表示输出,yaml表示输出格式为yaml,当然,json格式也可以。如果不想看到警告W0915 11:17:31.171659   24955 helpers.go:535] ,那么修改成--dry-run=client 即可。

[root@master ~]# k run nginx --image=nginx:1.18 --dry-run -o yaml >nginx.yaml
W0915 11:17:31.171659   24955 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@master ~]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx:1.18
    name: nginx
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

OK,命令行生成的资源清单文件已经生成,该有的基本结构都有了。

(2)

命令行多参:打标签,pod的重启策略,暴露端口,资源限制设置

[root@master ~]#  k run nginx --image=nginx:1.18 --dry-run=client --restart=Never --labels="app=nginx1" --port=1234 --limits='cpu=200m,memory=512Mi' -o yaml >nginx.yaml
[root@master ~]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    app: nginx1
  name: nginx
spec:
  containers:
  - image: nginx:1.18
    name: nginx
    ports:
    - containerPort: 1234
    resources:
      limits:
        cpu: 200m
        memory: 512Mi
  dnsPolicy: ClusterFirst
  restartPolicy: Never
status: {}

(3)

service的资源清单文件生成

现在如果执行以上yaml文件,只能集群内看到nginx的首页,如果想暴露给同网段内使用,需要编辑一个service文件,采用nodepod模式暴露(第一种命令):

[root@master ~]# kubectl expose pod nginx   --port=38080 --target-port=80  --type=NodePort --dry-run=client -o yaml >service-nginx.yaml

service文件内容(第一种方式的service):

[root@master ~]# cat service-nginx.yaml 
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx1
  name: nginx
spec:
  ports:
  - port: 38080
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx1
  type: NodePort
status:
  loadBalancer: {}

 

 

这里特别注意,不要搞错了,是nginx1,因为前面的pod里的label是nginx1(第二种命令):

[root@master logs]# k create svc  nodeport nginx1 --tcp=38080:80 -o yaml --dry-run=client >service-nginx2.yaml

 

service文件内容(第二种方式的service):

[root@master logs]# cat service-nginx2.yaml 
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: nginx1
  name: nginx1
spec:
  ports:
  - name: 38080-80
    port: 38080
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx1
  type: NodePort
status:
  loadBalancer: {}

 

kubernetes的网络逻辑是这样的:镜像nginx:1.18启动的服务端口是80,映射到38080,kube-proxy代理38080端口到30068端口,

I0915 09:18:41.192677    1200 proxier.go:812] Stale udp service kube-system/coredns:dns -> 10.0.0.2
I0915 14:11:25.049350    1200 service.go:379] Adding new service port "default/nginx:" at 10.0.0.107:38080/TCP
I0915 14:11:25.096252    1200 proxier.go:1655] Opened local port "nodePort for default/nginx:" (:30634/tcp)
I0915 14:12:53.039292    1200 service.go:404] Removing service port "default/nginx:"
I0915 14:12:56.347842    1200 service.go:379] Adding new service port "default/nginx:" at 10.0.0.3:38080/TCP
I0915 14:12:56.399977    1200 proxier.go:1655] Opened local port "nodePort for default/nginx:" (:30068/tcp)

执行以上文件,此时任意节点ip:30068就可以访问到pod所启动的nginx镜像的首页啦:

本例中,labels app=nginx1和前面的pod里的label是相呼应的。

 

[root@master ~]# k describe svc nginx1
Name:                     nginx1
Namespace:                default
Labels:                   app=nginx1
Annotations:              Selector:  app=nginx1
Type:                     NodePort
IP:                       10.0.0.89
Port:                     38080-80  38080/TCP
TargetPort:               80/TCP
NodePort:                 38080-80  32602/TCP
Endpoints:                10.244.0.22:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

三,

deployment资源的创建

k create deploy tomcat --image=bitnami/tomcat    --dry-run  -o yaml >tomcat.yaml

deployment控制器比较复杂,一般只是使用命令行创建一个基本的模板文件,然后在此基础上修改,一个deployment大体包括以下几个主要部分:

apiversion,kind,metadata,spec,status这五个模块,其中的status可以没有。

[root@master ~]# kubectl explain deploy
KIND:     Deployment
VERSION:  apps/v1
DESCRIPTION:
     Deployment enables declarative updates for Pods and ReplicaSets.
FIELDS:
   apiVersion <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources
   kind <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds
   metadata <Object>
     Standard object metadata.
   spec <Object>
     Specification of the desired behavior of the Deployment.
   status <Object>
     Most recently observed status of the Deployment.

查询子模块

例如spec:

[root@master ~]# kubectl explain deploy.spec
KIND:     Deployment
VERSION:  apps/v1
RESOURCE: spec <Object>
DESCRIPTION:
     Specification of the desired behavior of the Deployment.
     DeploymentSpec is the specification of the desired behavior of the
     Deployment.
FIELDS:
   minReadySeconds  <integer>
     Minimum number of seconds for which a newly created pod should be ready
     without any of its container crashing, for it to be considered available.
     Defaults to 0 (pod will be considered available as soon as it is ready)
略略略。。。。。。。。。。。。。。。。。。。

主要的还是根据以上explain(解释说明)来填充yaml文件,那么,这个yaml文件是根据层级来确定模块的,比如,我想查询import的拉取规则如何定义:

[root@master ~]# kubectl explain deploy.spec.template.spec.containers.imagePullPolicy
KIND:     Deployment
VERSION:  apps/v1
FIELD:    imagePullPolicy <string>
DESCRIPTION:
     Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always
     if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.
     More info:
     https://kubernetes.io/docs/concepts/containers/images#updating-images

OK,上面的说明就非常清楚了, One of Always, Never, IfNotPresent,三种拉取规则。

如何玩转编写资源清单文件,路子我提供了,大家可以试一试哦。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
28 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
11天前
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
121 10
|
15天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。
|
29天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
22天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
20天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。