• k8s(Kubernetes)中yaml文件快速阅读理解


    简言:


            k8s yaml中文件内容一般有kind类型之分,每种类型有不同的功能(一般用---符号隔开)

    常见的kind类型:

            (1)Endpoints:Endpoints可以把外部的链接到k8s系统中(可以理解为引用外部资源,如将一个外部mysql连接到k8s中)

            (2)Service:部署一个内部虚拟IP,其他deployment可以链接。(可以简单理解为K8S的端口映射,如外部3444端口映射到pod应用中80端口)

            (3)Secrets:用于存储和管理一些敏感数据,比如密码,token,密钥等敏感信息。(可以理解为ssh中的密钥)

            (4)Deployment:部署一个Pod,内部只能链接service,无法互相链接。(可以简单理解为一个pod应用的部署工具,即使部署的应用挂了还能重启,但只能链接service服务)

    备注:

    (1)metadata一般每个类型中会带有metadata.name即表示该类型生成的名字,如

    1. metadata:
    2.   name: suncat

    (2)spec,资源详细定义,后面一般会带有该类型的详细信息。

    如Service类型中定义接口的信息

    1. spec:
    2.   ports:
    3.     - port: 3306
    4.       targetPort: 3306
    5.       protocol: TCP
    6.       name: http

    下面分别对下面几种kind类型来进行讲解:

    一、Endpoints


    先来看个需求:

            我有个一个外部的mysql,不是使用本机的k8s部署的。但是现在我的应用程序想用它。那这时候,我改怎么使用它呢?毕竟k8s中的pod大部分只能通过service来链接。

    这时候Endpoints就出现了,他是可以把外部的链接到k8s系统中,如:

    1. apiVersion: v1
    2. kind: Endpoints
    3. metadata:
    4.   name: suncat-endpoints
    5. subsets:
    6.   - addresses: # 代理ip
    7.       - ip: 192.168.14.144
    8.     ports:
    9.       - port: 3306 # 服务的端口
    10.         protocol: TCP
    11.         name: http
    12. ---
    13. apiVersion: v1
    14. kind: Service
    15. metadata:
    16.   name: suncat-endpoints # 这里的名称要和上面一样才能关联
    17. spec:
    18.   ports:
    19.     - port: 3306
    20.       targetPort: 3306
    21.       protocol: TCP
    22.       name: http

            (1)首先我们看到,我们定义了名为suncat-endpoints的Endpoints,同时往suncat-endpoints配置了代理IP以及服务的端口。

            (2)接着我们看下一个,以---分隔符隔开的另一个类型Service,定义了一个名为suncat-endpoints的Service,同时往该Service中配置内部端口映射到Pod暴露出的端口port: 3306,以及对外暴露的端口号targetPort: 3306

            总结:通过配置Endpoints以及Service,Endpoints将k8s的端口链接到外部mysql端口,而Service将k8s中内部的端口映射到k8s端口,以此就完成了pod应用访问外部链接。

    二、Service


    先来看个需求:

            我们K8S里启动了一个pod应用,并里面运行了端口为8848的前端页面。这时候,我外部怎么访问K8S内部pod应用这个端口为8848的前端页面?

            这时候就需要定义Service类型了,使pod应用端口8848映射到K8S特定端口中,外部应用访问K8S特定端口即可访问前端页面

    样例:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4.   name: suncat-service
    5. spec:
    6.   type: NodePort
    7.   ports:
    8. # 内部端口映射到Pod暴露出的端口
    9.   - port: 8848
    10. # 对外暴露的端口号,如果不指定则随机生成一个端口号
    11.     nodePort: 38011
    12.   selector:
    13.     app: suncat-app

            首先我们看到,定义了一个名为suncat-service的Service类型,他的职责时将port: 8848端口映射到nodePort: 38011对外暴露端口,并且他的管理的对应的应用时suncat-app应用

            也就是说,将pod应用名为suncat-app中端口为8848的端口映射到对外暴露端口38011,只要外部服务访问该服务器IP:38011,即可区访问k8s中suncat-app应用的8848端口

    三、Secrets

            这个类型比较有意思,更多是用作于类似密钥的形式。

            (估计是不想明文记录账号密码等信息,但大部分加密都是Base64加密。所以说,我觉得有点像是防君子不防小人)

    Secret有三种类型:

    (1)Opaque

                    base64 编码格式的 Secret,用来存储密码、密钥等;但数据也可以通过base64 –decode解码得到原始数据,所有加密性很弱。

    (2)Service Account

            用来访问Kubernetes API,由Kubernetes自动创建,并且会自动挂载到Pod的的/run/secrets/kubernetes.io/serviceaccount 目录中。

    (3)kubernetes.io/dockerconfigjson

            用来存储私有docker registry的认证信息。

    下面分别讲解一下:

    Opaque:这种一般是加密一些账号密码,然后作为环境变量中使用

    例子:

    1. apiVersion: v1
    2. kind: Secret
    3. metadata:
    4.   name: suncat_secret_userinfo
    5. type: Opaque
    6. data:
    7.   name: c3VuY2F0
    8.   age: MjY=

            首先我们看到,定义了一个名为suncat_secret_userinfo的Secret类型,属于Secret下的Opaque种类,它所带key-value键值数据有两个分别是“name: c3VuY2F0”和“age: MjY=”。

            可能这样看有点不是很理解name是什么值、age是什么值,我们不妨将他们的值用Base64解密一下。

    字段原值Base64解密后的值
    namec3VuY2F0suncat
    ageMjY=26

            可以看到”name“的值为“suncat”,“age”的值是“26”

    创建的secret的使用方法有挂载和环境变量两种,以下只介绍在环境变量中的使用方法:

    1. env:
    2.     - name: username
    3.       valueFrom:
    4.         secretKeyRef:
    5.           name: suncat_secret_userinfo
    6.           key: name
    7.     - name: userage
    8.       valueFrom:
    9.         secretKeyRef:
    10.           name: suncat_secret_userinfo
    11.           key: age

    kubernetes.io/dockerconfigjson:一般是用来拉镜像的密钥。比如自己搭建的harbor,有些镜像肯定不是公开的,是私密的。这时候拉取镜像就需要密码,需要密钥。

    例子:

    1. apiVersion: v1
    2. kind: Secret
    3. metadata:
    4.  name: suncat-harbor-secret
    5. type: kubernetes.io/dockerconfigjson
    6. data:
    7.  .dockerconfigjson: eyJhdXRocyI6eyIxOTIuMTY4LjAuMTo4MDkwIjp7InVzZXJuYW1lIjoic3VuY2F0IiwicGFzc3dvcmQiOiIxMjM0NTYiLCJhdXRoIjoiYzNWdVkyRjBPakV5TXpRMU5nPT0ifX19

            首先我们看到,定义了一个名为suncat-harbor-secret的Secret类型,属于Secret下的kubernetes.io/dockerconfigjson种类,它所带的dockerconfigjson数据是一个由base64加密的json数据

            我们将

    eyJhdXRocyI6eyIxOTIuMTY4LjAuMTo4MDkwIjp7InVzZXJuYW1lIjoic3VuY2F0IiwicGFzc3dvcmQiOiIxMjM0NTYiLCJhdXRoIjoiYzNWdVkyRjBPakV5TXpRMU5nPT0ifX19

            进行base64解密:

    {"auths":{"192.168.0.1:8090":{"username":"suncat","password":"123456","auth":"c3VuY2F0OjEyMzQ1Ng=="}}}

    我们把格式弄得漂亮一点再看看

    1. {
    2.     "auths":{
    3. "192.168.0.1:8090":{
    4. "username":"suncat",
    5. "password":"123456",
    6. "auth":"c3VuY2F0OjEyMzQ1Ng=="
    7. }
    8. }
    9. }

            我们可以看出,这是一个验证的信息,192.168.0.1:8090值的是harbor仓库的地址,而username后的值“suncat”是登录账号,password后的值“123456”是登录密码

            而auth后的值"c3VuY2F0OjEyMzQ1Ng=="则又是一个base64加密的值,它用于校验。我们将其解密后得到suncat:123456,也就是账号跟密码

    备注:

    创建k8s集群的kubernetes.io/dockerconfigjson种类的secret

    1. kubectl -n <命名空间> create secret docker-registry <secret名> \
    2.   --docker-server=<域名或ip:port> \
    3.   --docker-username=<用户名> \
    4.   --docker-password=<密码>

    例如:

    1. kubectl -n suncat-test-secret create secret docker-registry registry-key \
    2.   --docker-server=registry.k8s.suncat \
    3.   --docker-username=suncat \
    4.   --docker-password=123456

    四、Deployment


    先来看一下需求:

            我们希望在k8s上部署一个应用,如果该应用挂了还能重启。如果单单创建一个pod类型是不够的,应为该pod应用挂了,就不会重启了。

            如果创建一个Deployment类型,可以创建管理该pod应用,挂了都会给你重启。

    例子:

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4.   name: suncat-deployment
    5. spec:
    6.   replicas: 1
    7.   selector:
    8.     matchLabels:
    9.       app: suncat-app
    10.   template:
    11.     metadata:
    12.       labels:
    13.         app: suncat-app
    14.     spec:
    15.       imagePullSecrets:
    16.       - name: suncat-harbor-secret
    17.       containers:
    18.       - name: suncat-app
    19.         image: registry.k8s.suncat:4444/suncat/testapp:1.0
    20.         ports:
    21.           - containerPort: 8848
    22.         imagePullPolicy: Always
    23.         resources:
    24.           limits:
    25.             cpu: "1"
    26.             memory: "400Mi"
    27.           requests:
    28.             cpu: "0.5"
    29.             memory: "200Mi"

    以上内容有点多,我们慢慢讲解:

            (1)首先,我们定义了名为suncat-deployment的Deployment,并且该Deployment所管理的app应用的标签是suncat-app,副本数为1。

            (2)然后在数据定义里定义了一个定义业务模板template。可以看出,在业务模板里定义了一个名为suncat-app的pod应用。

            (3)同时该业务模板还定义了该suncat-app应用的容器名,同样也名为suncat-app,而该容器所拉取的镜像来源于registry.k8s.suncat:4444/suncat/testapp:1.0。

            这时候就会有人问,如果该拉取镜像的地址是非公开的,需要密码的。那该怎么办呢?

            还记得上面说到的类型Secrets下的kubernetes.io/dockerconfigjson种类么,这东西就是用来作密钥拉镜像的,只需要在imagePullSecrets下配置一个事先创建好的、名为suncat-harbor-secret的密钥即可拉取镜像

            (4)就是配置一些该pod的端口为8848,拉取方式imagePullPolicy为Always总是拉取pull

            (5)这个的话,就是配置该pod的正常请求cpu和内存,以及最大限制的cpu和内存。当然你不设置也所谓。

            在该配置中,我设置该pod正常请求的cpu为0.5(半核)以及内存为200M,最大限制的cpu为1核、以及内存为400M

    备注:

    1、imagePullPolicy拉取方式参数详情有哪些?

            (1)Always:总是拉取pull

            (2)IfNotPresent:默认值,本地有则使⽤本地镜像,不拉取

            (3)Never:只使⽤本地镜像,从不拉取

  • 相关阅读:
    Java中的基本数据类型
    基于YOLOV7的openpose人体姿态检测识别,FPS可以达到“较高”的效果
    java计算机毕业设计房屋租赁网站MyBatis+系统+LW文档+源码+调试部署
    Win命令行CMD常用命令大全
    OpenSign 开源 PDF 电子签名解决方案
    15天深度复习JavaWeb的详细笔记(一)——JDBC
    [组合计数]Counting Stickmen 2022杭电多校第7场 1003
    ROS从入门到精通系列(二十七)-- ros Parameter Server
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    Node中的CSRF攻击和防御
  • 原文地址:https://blog.csdn.net/github_37130188/article/details/126199473