文档 · 2021年5月17日 0

使用yaml创建一个k8s应用

当我们搭建成功了自己的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
打赏