• 云原生Kubernetes:Yaml文件编写


    目录

    一、理论

    1.Kubernetes与yaml文件

    2.deployment、rc、rs之间yaml文件的对比

    3.Deployment类型编写redis服务

    二、实验

    1.Kubernetes与yaml文件

    2.Deployment类型编写redis服务

    三、问题

    1.声明式生成yaml文件报错

    2.上下文格式配置错误

    3.kubectl create 和 kubectl apply区别

    四、总结


    一、理论

    1.Kubernetes与yaml文件

    (1)Kubernetes支持管理资源对象的文件格式

    Kubernetes支持YAML 和JSON 格式管理资源对象

    1. JSON格式:主要用于api 接口之间消息的传递
    2. YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读

    (2)YAML语法格式

    1. ●大小写敏感
    2. ●使用缩进表示层级关系
    3. ●不支持Tab键制表符缩进,只使用空格缩进
    4. ●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格:
    5. ●字符后缩进一 个空格,如冒号,逗号,短横杆(-)等
    6. "—"表示YAML格式, 一个文件的开始,用于分隔文件间
    7. ●“#"表示注释

    (3)查看api资源版本标签

    kubectl api-versions
    

    Which Kubernetes apiVersion Should I Use? - Kubernetes Book

    版本如下:

    1. alpha
    2. 名称中带有alpha的API版本是进入Kubernetes的新功能的早期候选版本。这些可能包含错误,并且不保证将来可以使用。
    3. beta
    4. API版本名称中的beta表示测试已经超过了alpha级别,并且该功能最终将包含在Kubernetes中。 虽然它的工作方式可能会改变,并且对象的定义方式可能会完全改变,但该特征本身很可能以某种形式将其变为Kubernetes。
    5. stable
    6. 稳定的apiVersion这些名称中不包含alpha或beta。 它们可以安全使用。
    7. v1
    8. 这是Kubernetes API的第一个稳定版本。 它包含许多核心对象。
    9. apps/v1
    10. apps是Kubernetes中最常见的API组,其中包含许多核心对象和v1。 它包括与在Kubernetes上运行应用程序相关的功能,如Deployments,RollingUpdates和ReplicaSets。
    11. autoscaling/v1
    12. 此API版本允许根据不同的资源使用指标自动调整容器。此稳定版本仅支持CPU扩展,但未来的alpha和beta版本将允许您根据内存使用情况和自定义指标进行扩展。
    13. batch/v1
    14. batchAPI组包含与批处理和类似作业的任务相关的对象(而不是像应用程序一样的任务,如无限期地运行Web服务器)。 这个apiVersion是这些API对象的第一个稳定版本。
    15. batch/v1beta1
    16. Kubernetes中批处理对象的新功能测试版,特别是包括允许您在特定时间或周期运行作业的CronJobs。
    17. certificates.k8s.io/v1beta1
    18. 此API版本添加了验证网络证书的功能,以便在群集中进行安全通信。 您可以在官方文档上阅读更多内容。
    19. extensions/v1beta1
    20. 此版本的API包含许多新的常用Kubernetes功能。 部署,DaemonSets,ReplicaSet和Ingresses都在此版本中收到了重大更改。
    21. policy/v1beta1
    22. 此apiVersion增加了设置pod中断预算和pod安全性新规则的功能
    23. rbac.authorization.k8s.io/v1
    24. 此apiVersion包含Kubernetes基于角色的访问控制的额外功能。这有助于您保护群集

    (4)写一个yaml文件demo

    1. mkdir /opt/demo
    2. cd /opt/demo/
    3. 参考模板:
    4. vim nginx-deployment.yaml
    5. apiVersion: apps/v1 #指定api版本标签
    6. kind: Deployment #定义资源的类型/角色,deployment 为副本控制器,此处资源类型可以是Deployment、Job、 Ingress、 Service等
    7. metadata: #定义资源的元数据信息,比如资源的名称、namespace、标签等信息
    8. name: nginx-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
    9. labels: #定义资源标签(Pod的标签)
    10. app: nginx
    11. spec: #定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
    12. replicas: 3 #定义副本数量
    13. selector : #定义标签选择器
    14. matchLabels: #定义匹配标签
    15. app: nginx #匹配上面的标签,需与上面的标签定义的app保持一致
    16. template: #定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
    17. metadata:
    18. labels:
    19. app: nginx
    20. spec:
    21. containers: #定义容器属性
    22. - name: nginx #定义一个容器名,一个- name: 定义一个容器
    23. image: nginx:1.15.4 #定义容器使用的镜像以及版本
    24. ports:
    25. - containerPort: 80 #定义容器的对外的端口
    26. 实例:
    27. vim nginx-deployment.yaml
    28. apiVersion: apps/v1
    29. kind: Deployment
    30. metadata:
    31. name: nginx-deployment
    32. namespace: kube-public
    33. labels:
    34. name: nginx-deployment
    35. spec:
    36. replicas: 3
    37. selector:
    38. matchLabels:
    39. app: nginx-demo1
    40. template:
    41. metadata:
    42. labels:
    43. app: nginx-demo1
    44. spec:
    45. containers:
    46. - name: nginx
    47. image: nginx:1.15.4
    48. ports:
    49. - name: http
    50. containerPort: 80

    创建资源对象

    kubectl create -f nginx-deployment.yaml
    

    查看创建的pod资源

    1. kubectl get pods -o wide -n kube-public
    2. kubectl get deploy -n kube-public

    创建service服务对外提供访问并测试

    1. vim nginx-server.yaml
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: nginx-demo1
    6. namespace: kube-public
    7. labels:
    8. name: nginx-demo1
    9. spec:
    10. type: NodePort
    11. ports:
    12. - port: 8080
    13. targetPort: 80
    14. nodePort: 31333
    15. selector:
    16. app: nginx-demo1
    1. kubectl apply -f nginx-server.yaml
    2. kubectl get svc -n kube-public

    在浏览器输入 nodeIP: nodePort 即可访问

    1. http://192.168.204.173:31333
    2. http://192.168.204.175:31333

    (5)k8s中的port

    1. ●port
    2. port是k8s集群内部访问service的端口,即通过clusterIP: port可以从Pod所在的Node. 上访问到service
    3. ●nodePort
    4. nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort 可以从外部访问到某个service。
    5. ●targetPort
    6. targetPort是Pod的端口,从port或nodePort来的流量经过kube-proxy 反向代理负载均衡转发到后端Pod的targetPort上,最后进入容器。
    7. ●containerPort
    8. containerPort是Pod内部容器的端口,targetPort 映射到containerPort

    (6)创建yaml文件模板

    kubectl run --dry-run 打印相应的API 对象而不执行创建

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run
    

    查看生成yaml格式

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml
    

    查看生成json格式

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o json 
    

    使用yaml格式导出生成模板,并进行修改以及删除一些不必要的参数

    kubectl run nginx-test --image=nginx --port=80 --replicas=3 --dry-run -o yaml > nginx-test.yaml
    

    生成镜像并查看

    1. kubectl apply -f nginx-test.yaml
    2. kubectl get svc -n kube-public

    将现有的资源生成模板导出

    kubectl get deployment/nginx-deployment --export -o yaml
    

    保存到文件中

    kubectl get deploy/nginx-deployment --export -o yaml > my-deploy.yaml
    

    查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

    1. kubectl explain deployments.spec.template.spec.containers
    2. kubectl explain pods.spec.containers

    (7)快速编写yaml

    用run命令生成

    kubectl run my-deploy --image=nginx --dry-run -o yaml > my-deploy.yaml

    用get命令导出

    kubectl get deploy/nginx-deployment --export -o=yaml > new.yaml

    2.deployment、rc、rs之间yaml文件的对比

    这些控制器作用是类似的,只是在yaml文件的语法上有些区别,比如apiVersion的值,以及selector下面是否有matchLabels等,总结如下:

    apiselect
    deploymentapps/v1

    selector:

      matchLabels:

    daemonsetapps/v1

    selector:

      matchLabels:

    ReplicationControllerv1selector:
    ReplicaSetapps/v1

    selector:

      matchLabels:

    3.Deployment类型编写redis服务

    (1)编写yaml文件

    1. vim demo02-redis.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: redis-deployment
    6. namespace: default
    7. labels:
    8. app: redis
    9. spec:
    10. replicas: 2
    11. selector:
    12. matchLabels:
    13. app: redis
    14. template:
    15. metadata:
    16. labels:
    17. app: redis
    18. spec:
    19. containers:
    20. - name: redis
    21. image: redis:latest
    22. ports:
    23. - containerPort: 6379
    24. ---
    25. apiVersion: v1
    26. kind: Service
    27. metadata:
    28. name: redis
    29. labels:
    30. app: redis
    31. spec:
    32. type: NodePort
    33. ports:
    34. - port: 6379
    35. targetPort: 6379
    36. nodePort: 32555
    37. selector:
    38. app: redis

    (2)创建与查询资源

    1. #创建资源
    2. kubectl apply -f demo02-redis.yaml 
    3. #查看创建的资源
    4. [root@master ~]# kubectl get pod,svc
    5. NAME READY STATUS RESTARTS AGE
    6. pod/redis-deployment-6774f6679-gzhsj 1/1 Running 0 10m
    7. pod/redis-deployment-6774f6679-sk7lj 1/1 Running 0 10m
    8. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    9. service/kubernetes ClusterIP 10.1.0.1 443/TCP 9d
    10. service/nginx-deployment NodePort 10.1.45.225 30000:30118/TCP 8d
    11. service/nginx-service NodePort 10.1.217.6 80:32755/TCP 7d1h
    12. service/redis NodePort 10.1.114.11 6379:32555/TCP 2m51s
    13. [root@master ~]#
    14. #查看pod详细信息
    15. [root@master ~]# kubectl get pods -o wide
    16. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    17. redis-deployment-6774f6679-gzhsj 1/1 Running 0 12m 10.244.2.28 node01
    18. redis-deployment-6774f6679-sk7lj 1/1 Running 0 12m 10.244.1.36 node02
    19. [root@master ~]#

    (3)使用Redis Desktop Manager测试redis

    连接设置:

    1. #地址可以填master地址或node节点地址,端口为service暴露端口号
    2. 地址:192.168.204.17
    3. 端口:32555

    添加键值对

    1. 键名: redis test
    2. 类型: string
    3. 键值: this is test

    查看键值对

    1. #登入查看创建的键值对
    2. [root@master ~]# kubectl exec -it redis-deployment-6774f6679-gzhsj bash
    3. root@redis-deployment-6774f6679-gzhsj:/data# redis-cli
    4. 127.0.0.1:6379> keys *
    5. 1) "redis test"
    6. 127.0.0.1:6379>

    二、实验

    1.Kubernetes与yaml文件

    (1)查看api资源版本标签

    (2) 写一个yaml文件demo

    创建资源对象

    查看创建的pod资源

    创建service服务对外提供访问并测试

    在浏览器输入 nodeIP: nodePort 即可访问

    1. http://192.168.204.173:31333
    2. http://192.168.204.175:31333

    (2) 创建yaml文件模板

    kubectl run --dry-run 打印相应的API 对象而不执行创建

    查看生成yaml格式

    查看生成json格式

    使用yaml格式导出生成模板,并进行修改以及删除一些不必要的参数

    生成镜像并查看

    将现有的资源生成模板导出

    保存到文件中

    查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

    2.Deployment类型编写redis服务

    (1)编写yaml文件

     (2)创建与查询资源

    创建资源

    查看创建的资源

    (3)使用Redis Desktop Manager测试redis

    连接设置

    测试连接成功

    添加新键

    填写

    查看

    登入查看创建的键值对

    三、问题

    1.声明式生成yaml文件报错

    (1)报错

    (2)原因分析

    1)unknown field "image" 

    imge的缩进位置不对

    2)unknown field "containerPort"

    containerPort的缩进位置不对

    (3)解决方法

    跳转image的缩进位置

    修改前:

    修改后:

    2.上下文格式配置错误

    (1)报错

    (2)原因分析

    1. YAML的键值对是由冒号和空格分开的,如果冒号不是半角,或者忘记加空格,就会出现无法识别的情况
    2. 在确认冒号和空格没有问题的情况下,看一下是不是写了多余的不能识别的东西。比如YAML只支持单行“#”注释,不支持“//”这种注释方法

    (3)解决方法

    键值对加空格

    修改前:

    修改后:

    3.kubectl create 和 kubectl apply区别

    (1)kubectl create

    第 1 次执行 kubectl create -f pod.xml 命令,正常结束,如下:

    1. kubectl create -f pod.xml
    2. pod/my-pod created

    第 2 次执行 kubectl create -f pod.xml 命令,抛出错误,如下:

    1. kubectl create -f pod.xml
    2. Error from server (AlreadyExists): error when creating “pod.xml”: pods “my-pod” already exists

    (2)kubectl apply

    第 1 次执行 kubectl apply -f pod.xml 命令,显示 created,如下:

    1. kubectl apply -f pod.xml
    2. pod/my-pod created

    第 2 次执行 kubectl apply -f pod.xml 命令,由于配置没改变,则显示 unchanged ,如下:

    1. kubectl apply -f pod.xml
    2. pod/my-pod unchanged

    (3)区别

    kubectl create:

    1. 1)kubectl create命令,是先删除所有现有的东西,重新根据yaml文件生成新的。所以要求yaml文件中的配置必须是完整的
    2. 2)kubectl create命令,用同一个yaml 文件执行替换replace命令,将会不成功,fail掉。

    kubectl apply:

      kubectl apply命令,根据配置文件里面列出来的内容,升级现有的。所以yaml文件的内容可以只写需要升级的属性


     

    四、总结

    Deployment书写方式:

     正确的Deployment书写方式,是要让spec.selector.matchLabels值和spec.template.metadata.lables值完全匹配,这样才不会报错。

    yaml文件的学习方法

    1. (1)多看别人(官方)写的,能读懂
    2. (2)能照着现场的文件改着用
    3. (3)遇到不懂的,善用kubectl explain ...命令查

    K8S集群中访问流向:

    1. port:为service在clusterIP上暴露的端口
    2. targetport:对应容器映射在pod上的端口
    3. nodeport:可以通过在K8S集群外部使用nodeIP+nodePort来去访问service
    4. containerport:容器内部使用的端口
    5. K8S集群内部:客户端——clusterIP:port——通过target port——podIP:containerport
    6. K8S集群外部:客户端——nodeIP:nodeport——通过target port——podIP:containerport

    yaml文件组成部署:

    1. (1)控制器定义
    2. deployment:定义metadaea、spec、selector
    3. 通过yaml完成副本的定义,自主式的
    4. (2)被控制对象
    5. 由哪一个控制器(自主式、deployment、statusfulset等)

  • 相关阅读:
    《HelloGitHub》第 79 期
    【CVE】CVE-2019-9193:PostgreSQL 任意命令执行漏洞
    树莓派安装wps2019教程
    Nginx -- -- 配置SSL证书
    生成CSR和自签名证书
    数据库设计(火车订票系统)
    SpringBoot - @ControllerAdvice注解详解
    python毕业设计作品基于django框架 教室图书馆座位预约系统毕设成品(5)任务书
    无涯教程-JavaScript - CHISQ.INV.RT函数
    535. TinyURL 的加密与解密
  • 原文地址:https://blog.csdn.net/cronaldo91/article/details/132733717