当我们搭建成功了自己的k8s 集群之后,就可以创建工作负载容器(pod)来使用k8s集群了,一般是通过yaml文件进行pod 的创建。本次就介绍一下如何使用yaml创建及删除pod
以创建nginx负载为例,编辑nginx-deployment.yaml
#api版本,可以通过kubectl api-versions 查看 apiVersion: apps/v1 #kind 定义yaml 的用途,官方说法叫定义一个对象 kind: Deployment #元数据 metadata: #pod的名字 name: nginx-deploy #指定命名空间,不指定默认放在default空间中。 namespace: default #资源内容的规范 spec: #副本数量,也就是几个pod replicas: 2 selector: matchLabels: #定义一个标签名字,下面设置亲和策略会用到,services.yaml 中也会用到 app: nginx template: metadata: #标签和注释 labels: app: nginx #定义一个容器pod spec: containers: #指定容器的名字 - name: nginx #指定容器的镜像 image: nginx #资源限制配置 resources: #预分配资源大小 requests: cpu: 100m memory: 128Mi #最大限制资源大小 limits: cpu: 500m memory: 512Mi #端口配置 ports: #指定容器端口 - containerPort: 80 #端口名字 name: nginx-tcp-port #挂载定义的存储卷到容器 volumeMounts: #名字与下面volumes中定义的name一致 - name: sys-time #挂载到容器中的路径 mountPath: /etc/localtime - name: filedata mountPath: /data #定义宿主机挂载 volumes: #定义挂载名字 - name: sys-time #定义宿主机中的挂载路径 hostPath: path: /etc/localtime - name: filedata hostPath: path: /volumes01 #pod调度部分 affinity: #pod在node节点调度方式,亲和 nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: #node的标签,查看方式: kubectl get nodes --show-labels - key: kubernetes.io/hostname #亲和策略: operator: In #可以调度的节点,值为node 标签的值。 values: - server02 - server01 #工作负载应用级的调度策略,非亲和 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: #应用的标签名字:key : value === 上面的 app: nginx - key: app operator: In values: - nginx #将应用均匀分布在标签中的节点,值为node标签。 topologyKey: kubernetes.io/hostname
注意格式。编写好之后就可以进行创建了
执行:apply -f nginx-deployment.yaml
#使用yaml 创建nginx 应用 [root@server01 nginx]# kubectl apply -f nginx-deployment.yaml deployment.apps/nginx-deploy created #查看pod 状态,因为指定了默认的命名空间所以不用加 -n 指定 [root@server01 nginx]# kubectl get po NAME READY STATUS RESTARTS AGE nginx-deploy-7fc4b66f67-6hq7w 1/1 Running 0 68s nginx-deploy-7fc4b66f67-zbx8x 1/1 Running 0 68s #查看deployment [root@server01 nginx]# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx-deploy 2/2 2 2 78s
pod创建好了怎么访问呢?这时候还需要创建一个services 用来访问nginx,使用nodeport 方式访问:
同样的编辑一个yaml 去创建这个services。
vim nginx-services.yaml #查看方法同上 apiVersion: v1 #指定创建的对象。 kind: Service #元数据 metadata: #给services定义个标签 labels: name: nginx-svc #给services 定义个名字 name: nginx-svc #指定在哪个空间运行 namespace: default spec: ports: #指定ClusterIP 端口,供集群内部访问使使用 - port: 80 #这个重点,要和nginx-deployment.yaml 中 containerPort 暴露出来的端口对应 targetPort: 80 #指定node暴露的端口,因为我们呢使用nodeport 的方式访问 nodePort: 30080 #指定访问类型 type: NodePort #指定容器的标签,是nginx-deployment.yaml 中spec 中容器标签的名字。 selector: app: nginx
应用nginx-services.yaml 创建网络服务:
# 创建nginx-services服务 [root@server01 nginx]# kubectl apply -f nginx-service.yaml service/nginx-svc created #查看services [root@server01 nginx]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.200.0.1 <none> 443/TCP 18d nginx-svc NodePort 10.200.19.128 <none> 80:30080/TCP 20s
至此 就可以使用nodeip+ nodeport访问nginx 啦
删除nginx容器及网络服务:
#删除nginx的deployment kubectl delete deploy nginx-deploy #删除nginx的services kubectl delete svc nginx-svc