八、Kubernetes 进阶之配置篇

学到现在,前面的七章其实已经足够开发使用,但如果想要对K8S有个进阶的认知,从现在开始才是真正的核心,很多第三方的yaml文件中还是有不少资源类型是我们不熟悉的,比如ConfigMap、ServiceAcount、DaemonSet等,以及Pod的生命周期、回收策略、重启策略的配置等。

本章节主要围绕Pod、ConfigMap、Secret进行展开!

1、Pod

对于Pod我们目前只知道它是K8S的一种资源类型,但对它还并不太了解,它还有些东西值得我们去学习。下面就开始学习Pod的生命周期、回收策略、重启策略。

1.1 Lifecycle

Pod的生命周期就是从创建Pod 到 Pod完成或失败的运行阶段的状态描述,是 Pod 在其生命周期中的宏观概述。

官方在对Pod的生命周期分为以下几个大阶段:

  • 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
  • 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
  • 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
  • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
  • 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。
八、Kubernetes 进阶之配置篇_第1张图片
image.png

上图STATUS就是Pod的生命周期

实际Pod还会有一些状态,比如Completed、Terminating等,这些到后面再解释

1.2 健康检查

Kubelet 可以选择是否执行在容器上运行的三种监控检查执行和做出反应:

  • livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供监控检查,则默认状态为 Success
    • 判断容器是否存活
  • readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪检查,则默认状态为 Success
    • 判断容器是否启动完成
  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探测(startup probe),则禁用所有其他探测,直到它成功为止。如果启动探测失败,kubelet 将杀死容器,容器服从其重启策略进行重启。如果容器没有提供启动探测,则默认状态为成功Success
    • 判断容器是否启动
八、Kubernetes 进阶之配置篇_第2张图片
image.png

上图是 nginx-ingress的YAML文件内容,这里就使用了健康检查

1.3 重启策略

PodSpec 中有一个 restartPolicy 字段,可能的值为 Always、OnFailure 和 Never。默认为 Always。

restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅指通过同一节点上的 kubelet 重新启动容器。失败的容器由 kubelet 以五分钟为上限的指数延迟(10秒,20秒,40秒…)重新启动,并在成功执行十分钟后重置。如 Pod 文档 中所述,一旦绑定到一个节点,Pod 将永远不会重新绑定到另一个节点。

  • Always:容器失效时,自动重启
  • OnFailure:容器终止运行且退出码不为0时重启
  • Never:永远不重启
八、Kubernetes 进阶之配置篇_第3张图片
image.png

配置方式如上所示

1.4 静态Pod

静态Pod是由kubelet直接进行管理的,并且存在于特定的Node上。不能通过API Server进行管理,无法与Replication Controller、Deployment或者Daemon Set进行关联,也无法进行健康检查。

八、Kubernetes 进阶之配置篇_第4张图片
image.png

像kube-system命名空间下的Pod,就是由kubelet直接管理的,它们所使用的IP都是宿主机所在IP,而不是calico插件分配的。

2、ConfigMap

ConfigMap 允许将配置文件与镜像文件分离,以使容器化的应用程序具有可移植性。

简单来说就是用来保存配置数据的键值对,也可以保存单个属性,也可以保存配置文件。

所有的配置内容都存储在etcd中,创建的数据可以供Pod使用。

2.1 创建方式

2.1.1 命令行创建

  • 创建ConfigMap

    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl create configmap my-config --from-literal=db.port='3306'
    configmap/my-config created
    
  • 查看ConfigMap

    # 查看创建的ConfigMap
    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl get cm
    NAME        DATA   AGE
    my-config   1      5s
    
    # 以YAML方式查看ConfigMap详情信息
    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl get configmap my-config -o yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      creationTimestamp: "2020-05-02T06:12:45Z"
      name: my-config
      namespace: default
      resourceVersion: "318695"
      selfLink: /api/v1/namespaces/default/configmaps/my-config
      uid: f0849fda-8c3b-11ea-9dfb-5254008afee6
    data:
      db.port: "3306"
    

2.1.2 从配置文件中创建

  • 创建配置文件

    [root@master-kubeadm-k8s k8s-springboot-demo]# vi cm.properties
    name=sunny
    age=25
    
  • 创建ConfigMap

    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl create configmap app --from-file=./cm.properties
    configmap/app created
    
  • 查看ConfigMap

    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl get configmap app -o yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      creationTimestamp: "2020-05-02T06:17:23Z"
      name: app
      namespace: default
      resourceVersion: "319070"
      selfLink: /api/v1/namespaces/default/configmaps/app
      uid: 968946cf-8c3c-11ea-9dfb-5254008afee6
    data:
      cm.properties: |
        name=sunny
        age=25
    

2.1.3 通过YAML文件创建

  • 创建YAML文件

    • configmaps.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: special-config
      namespace: default
    data:
      name: snny
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: env-config
      namespace: default
    data:
      log_level: INFO
    
  • 创建ConfigMap

    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl apply -f configmaps.yaml
    configmap/special-config created
    configmap/env-config created
    
  • 查看ConfigMap

    [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl get cm
    NAME             DATA   AGE
    app              1      3m56s
    env-config       1      45s
    my-config        1      9m32s
    special-config   1      45s
    

2.2 ConfigMap的使用

2.2.1 通过环境变量的方式,直接传递给pod

  • 创建YAML文件
    • pod_nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    env:
      - name: ENV_LEVEL_KEY
        valueFrom:              # 值来源
          configMapKeyRef:      # 表示使用ConfigMap
            name: env-config    # ConfigMap名称
            key: log_level      # ConfigMap中的具体的key名称
  • 创建资源
[root@master-kubeadm-k8s ~]# kubectl apply -f pod_nginx.yaml
  • 进入容器查看环境变量
[root@master-kubeadm-k8s ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-77945f44db-sllmh   1/1     Running   2          39h
nginx-pod                1/1     Running   0          21m

# 进入容器
[root@master-kubeadm-k8s ~]# kubectl exec -it nginx-pod bash

# 输出环境变量
root@nginx-pod:/# echo $ENV_LEVEL_KEY
INFO

2.2.2 通过在pod的命令行下运行的方式(启动命令中)

  • 创建YAML文件

    • command-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: command-configmap
    spec:
      containers:
        - name: test-container
          image: busybox
          command: [ "/bin/sh", "-c", "echo $(SPECIAL_LEVEL_KEY)" ] # 引用环境变量中的ConfigMap值
          env:
            - name: SPECIAL_LEVEL_KEY
              valueFrom:
                configMapKeyRef:
                  name: special-config
                  key: name
      restartPolicy: Never
    
  • 创建资源

    [root@master-kubeadm-k8s ~]# kubectl apply -f command-pod.yaml
    pod/command-configmap created
    
  • 查看容器日志

    这里看到了 Pod 的另一种生命周期状态:Completed

    这表示Pod的任务已经完成了,因为我们的Pod功能就只是输出一段命令

    [root@master-kubeadm-k8s ~]# kubectl get pods
    NAME                     READY   STATUS      RESTARTS   AGE
    command-configmap        0/1     Completed   0          46s
    nginx-77945f44db-sllmh   1/1     Running     2          39h
    nginx-pod                1/1     Running     0          32m
    
    # 查看日志,正常输出ConfigMap定义的值了
    [root@master-kubeadm-k8s ~]# kubectl logs command-configmap
    sunny
    

2.2.3 作为volume的方式挂载到pod内

  • 作为volume挂载使用

    将创建的ConfigMap直接挂载至Pod的某个目录下,其中每一个key-value键值对都会生成一个文件,key为文件名,value为内容

    • 创建YAML文件

      • pod-configmap-volume.yaml
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-configmap-volume
      spec:
        containers:
          - name: test-container
            image: busybox
            command: [ "/bin/sh", "-c", "ls /etc/config/" ]   # 执行 ls /etc/config/ 命令
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
        volumes:
          - name: config-volume
            configMap:                    # 挂载方式采用ConfigMap
              name: special-config        # ConfigMap名称
        restartPolicy: Never
      
    • 创建资源

      [root@master-kubeadm-k8s ~]# kubectl apply -f pod-configmap-volume.yaml
      
    • 查看容器日志

      # name 是我们之前在ConfigMap中定义的 Key 名称,这里已经作为文件存在了
      [root@master-kubeadm-k8s ~]# kubectl logs pod-configmap-volume
      name
      

2.2.4 ConfigMap在Ingress Controller中的应用

  • 查看nginx-ingress配置文件

    apiVersion: v1
    kind: Namespace
    metadata:
      name: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    ---
    # nginx-ingress在初期就定义好了几个ConfigMap,但是没有设置数据
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: nginx-configuration
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: tcp-services
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: udp-services
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    
    # ... 省略 ...
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-ingress-controller
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/name: ingress-nginx
          app.kubernetes.io/part-of: ingress-nginx
      template:
        metadata:
          labels:
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
          annotations:
            prometheus.io/port: "10254"
            prometheus.io/scrape: "true"
        spec:
          # wait up to five minutes for the drain of connections
          terminationGracePeriodSeconds: 300
          serviceAccountName: nginx-ingress-serviceaccount
          hostNetwork: true
          nodeSelector:
            name: ingress
            kubernetes.io/os: linux
          containers:
            - name: nginx-ingress-controller
              image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
              args:
                - /nginx-ingress-controller
                
                # 这里将上面定义的ConfigMap传递到了容器中,这可以很方便的调整Nginx的参数
                - --configmap=$(POD_NAMESPACE)/nginx-configuration
                - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
                - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
                - --publish-service=$(POD_NAMESPACE)/ingress-nginx
                - --annotations-prefix=nginx.ingress.kubernetes.io
                
    # ... 省略 ...
    

可以看到上面的mandatory.yaml文件中使用了ConfigMap,发现有nginx-configuration、tcp-services等名称的ConfigMap,而且也发现最后在容器的参数中使用了这些ConfigMap。

但它为什么ConfigMap中没有设置数据呢?这不就是一个空的ConfigMap资源吗?

其实他提供的ConfigMap是为了用户考虑的,我们如果想要修改nginx.conf的参数,就可以通过ConfigMap的方式去修改!

  • 证明Ingress Controller中ConfigMap的使用

    • 查看Ingress Controller所在节点

      [root@master-kubeadm-k8s ~]# kubectl get pods -n ingress-nginx -o wide
      NAME                                        READY   STATUS    RESTARTS   AGE   IP               NODE                   NOMINATED NODE   READINESS GATES
      nginx-ingress-controller-5588956455-j6589   1/1     Running   0          13d   192.168.50.112   worker01-kubeadm-k8s              
      
    • 进入容器

      [root@master-kubeadm-k8s ~]# kubectl exec -it nginx-ingress-controller-5588956455-j6589 bash
      
      # 可以看到它其实就是一个nginx容器,这里会有nginx.conf文件
      root@nginx-ingress-controller:/etc/nginx# ls
      conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf
      

    我们配置的ingress访问规则其实就是动态的在nginx.cong文件中增加一个location,nginx帮我们实现了转发,所以我们才可以通过域名访问到Service

    • 查看nginx.conf,选择一个要修改的配置
      # Custom headers to proxied server
    
    proxy_connect_timeout                   5s;
    proxy_send_timeout                      60s;
    
    # 比如我们选择修改 proxy_read_timeout
    proxy_read_timeout                      60s;
    
    proxy_buffering                         off;
    proxy_buffer_size                       4k;
    proxy_buffers                           4 4k;
    proxy_max_temp_file_size                1024m;
    
  • 编写一个ConfigMap动态修改nginx配置

    • ingress-configmap.yaml

    ingress-nginx那里定义的ConfigMap实际只是为用户开放一个门,先把ConfigMap定义好,我们如果要想动态修改配置,可以自己写一个ConfigMap资源文件,只要资源的名称一致,ingress-nginx-controller就可以动态的加载配置!

    nginx-configuration

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: nginx-configuration # 与ingress-nginx配置的ConfigMap名称一致
      namespace: ingress-nginx
      labels:
        app: ingress-nginx
    data:
      proxy-read-timeout: "210" # 修改nginx.conf文件中的配置
    
  • 创建资源

    [root@master-kubeadm-k8s configmap]# kubectl apply -f ingress-configmap.yaml
    configmap/nginx-configuration configured
    
  • 再次查看ingress-nginx容器中的nginx.conf文件

八、Kubernetes 进阶之配置篇_第5张图片
image.png

ConfigMap定义规则都在nginx ingress controller的官网中

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/

八、Kubernetes 进阶之配置篇_第6张图片
image.png

2.2.5 注意事项

  • ConfigMap必须在Pod使用它之前创建
  • 使用envFrom时,将会自动忽略无效的键
  • Pod只能使用同一个命名空间的ConfigMap

3、Secret

Secret 对象类型是用来保存敏感信息的,例如密码、OAuth 令牌和 ssh key。

将这些信息放在 secret 中比直接放在 Pod 的定义或者 容器镜像 中来说会更加安全和灵活。

3.1 Secret 概览

这样的信息可能会被放在 Pod spec 中或者镜像中;将其放在一个 secret 对象中可以更好地控制它的用途,并降低意外暴露的风险。

用户可以创建 secret,同时系统也创建了一些 secret。

要使用 secret,pod 需要引用 secret。Pod 可以用两种方式使用 secret:作为 volume 中的文件被挂载到 pod 中的一个或者多个容器里,或者当 kubelet 为 pod 拉取镜像时使用。

内置secret

Kubernetes 会自动创建包含访问 API 凭据的 secret,并自动修改 pod 以使用此类型的 secret。

如果需要,可以禁用或覆盖自动创建和使用 API 凭据。

3.2 secret类型

  • Opaque:使用base64编码存储信息,可以通过base64 --decode解码获得原始数据,因此安全性弱。
  • kubernetes.io/dockerconfigjson:用于存储docker registry的认证信息。
  • kubernetes.io/service-account-token:用于被 serviceAccount 引用。serviceAccout 创建时 Kubernetes 会默认创建对应的 secret。

3.3 创建secret

  • Opaque Secret

    Opaque类型的Secret的value为base64位编码后的值

    • 从文件中创建

      # 对密码进行base64编码
      [root@master-kubeadm-k8s docker]# echo 'admin' | base64
      YWRtaW4K
      
      # 写用户名
      [root@master-kubeadm-k8s secret]# echo -n "admin" > ./username.txt
      # 写密码
      [root@master-kubeadm-k8s secret]# echo -n "YWRtaW4K" > ./password.txt
      [root@master-kubeadm-k8s secret]# ll
      total 8
      -rw-r--r--. 1 root root 8 May  2 10:52 password.txt
      -rw-r--r--. 1 root root 5 May  2 10:51 username.txt
      
      # 创建secret
      [root@master-kubeadm-k8s secret]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
      secret/db-user-pass created
      
      # 查看secret, 也可以看到默认会有一个kubernetes.io/service-account-token类型的secret
      [root@master-kubeadm-k8s secret]# kubectl get secret
      NAME                  TYPE                                  DATA   AGE
      db-user-pass          Opaque                                2      29s
      default-token-xggf5   kubernetes.io/service-account-token   3      38d
      
    • 使用yaml文件创建

      • 先拿到base64编码后的账号密码

        [root@master-kubeadm-k8s docker]# echo 'admin' | base64
        YWRtaW4K
        [root@master-kubeadm-k8s secret]# echo 'admin123' | base64
        YWRtaW4xMjMK
        
      • mysecret.yaml

        apiVersion: v1
        kind: Secret
        metadata:
          name: mysecret
        type: Opaque
        data:
          username: YWRtaW4K
          password: YWRtaW4xMjMK
        
      • 创建secret

        [root@master-kubeadm-k8s secret]# kubectl apply -f mysecret.yaml
        secret/mysecret created
        
        # 查看secret
        [root@master-kubeadm-k8s secret]# kubectl get secret
        NAME                  TYPE                                  DATA   AGE
        db-user-pass          Opaque                                2      5m37s
        default-token-xggf5   kubernetes.io/service-account-token   3      38d
        mysecret              Opaque                                2      11s
        
    • Secret使用

      • 以Volume方式

        • 将Secret挂载到Volume中

        • mypod.yaml

          apiVersion: v1
          kind: Pod
          metadata:
            name: volume-secret
          spec:
            containers:
            - name: mypod
              image: nginx
              volumeMounts:
              - name: foo
                mountPath: "/etc/foo"
                readOnly: true
            volumes:
            - name: foo
              secret:
                secretName: mysecret
          
        • 创建资源

          [root@master-kubeadm-k8s opaque]# kubectl apply -f volume-secret.yaml
          pod/volume-secret created
          
        • 查看挂载文件

          # 进入容器
          [root@master-kubeadm-k8s opaque]# kubectl exec -it volume-secret bash
          root@volume-secret:/# cd /etc/foo/
          
          root@volume-secret:/etc/foo# ls
          password  username
          
          # 查看内容,这与ConfigMap一样,挂载进来都是以文件的方式存在
          root@volume-secret:/etc/foo# cat username
          admin
          root@volume-secret:/etc/foo# cat password
          admin12
          
      • 以环境变量方式

        • env-secret.yaml

          apiVersion: v1
          kind: Pod
          metadata:
            name: env-secret
          spec:
            containers:
            - name: mycontainer
              image: nginx
              env:
                - name: SECRET_USERNAME
                  valueFrom:
                    secretKeyRef:
                      name: mysecret
                      key: username
                - name: SECRET_PASSWORD
                  valueFrom:
                    secretKeyRef:
                      name: mysecret
                      key: password
            restartPolicy: Never
          
        • 创建资源

          [root@master-kubeadm-k8s opaque]# kubectl apply -f env-secret.yaml
          pod/env-secret created
          
        • 查看环境变量

          [root@master-kubeadm-k8s opaque]# kubectl exec -it env-secret bash
          
          # 查看环境变量
          root@env-secret:/# echo $SECRET_USERNAME
          admin
          root@env-secret:/# echo $SECRET_PASSWORD
          admin123
          
  • kubernetes.io/dockerconfigjson

    kubernetes.io/dockerconfigjson用于存储docker registry的认证信息,可以直接使用kubectl create secret命令创建

    一般是在拉取私有镜像仓库中的image时使用,在前面的实战章节中我们也演示过

    • 创建secret

       # 创建保存授权令牌的 Secret
      [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl create secret docker-registry registry-aliyun --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=[用户名] --docker-password=[密码] --docker-email=[邮箱]
      secret/registry-aliyun created
            
      # 检查 Secret
      [root@master-kubeadm-k8s k8s-springboot-demo]# kubectl get secret registry-aliyun --output=yaml
      apiVersion: v1
      kind: Secret
      metadata:
        creationTimestamp: "2020-05-02T19:18:24Z"
        name: registry-aliyun
        namespace: default
        resourceVersion: "109789"
        selfLink: /api/v1/namespaces/default/secrets/registry-aliyun
        uid: 368a54cd-22ggb-11ea-28ty-5254008afee6
      type: kubernetes.io/dockerconfigjson
      data:
        .dockerconfigjson: eyJhdXRocyI6eyJyZWdpc3RyeS5jbi1oYW5nemhvdS5hbGl5dW5jcy5jb20iOnsidXNlcm5hbWUiOiJ5enlfemhhb3lhbmdAMTYzLmNvbSIsInBdkjhasjdhksabdkajaksddasdaWwiOiJ5enlfemhhb3lhbmdAMTYzLmNvbSIsImF1dGgiOiJlWHAkcjnhkcnhamoewr3242309jdsjaldj092qeGIxbEJUa2MxTmpJMU5ERTQifX19
      
      # 可以使用base64解码查看secret
      [root@master-kubeadm-k8s opaque]# kubectl get secret registry-aliyun --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
      
      # secret内容
      {"auths":{"registry.cn-hangzhou.aliyuncs.com":{"username":"用户名","password":"密码","email":"邮箱","auth":"eXpgh5YW95YW5nQDE2das45hhb1lrege231NjI1NDE4"}}}
      
    • 使用 dockerconfigjson secret

      如果镜像仓库是私有的,必须是要有secret才能拉取到

      apiVersion: apps/v1
      kind: Deployment
      metadata: 
        name: springboot-demo
      spec: 
        selector: 
          matchLabels: 
            app: springboot-demo
        replicas: 1
        template: 
          metadata:
            labels: 
              app: springboot-demo
          spec: 
            containers: 
            - name: springboot-demo
              # 这里的镜像是私有的镜像仓库地址
              image: registry.cn-hangzhou.aliyuncs.com/sunny95/springboot-demo-image:v1.0
              ports: 
              - containerPort: 8080
              #=========增加 Secret===========
            imagePullSecrets:
            - name: registry-aliyun   # 注意名称要与创建时指定的名称一致
              #=========增加 Secret===========
      
  • kubernetes.io/service-account-token

    • 前提说明

      • Service Account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的
      • 每个namespace都会自动创建一个default service account
      • Token controller会检测service account的创建,并为它们创建secret
      • 开启ServiceAccount Admission Controller
        • 每个Pod在创建后都会自动设置spec.serviceAccount为default(除非指定了其他ServiceAccout)
        • 验证Pod引用的service account已经存在,不存在会拒绝创建
        • 如果Pod没有指定ImagePullSecrets,则把service account的ImagePullSecrets加到Pod中
        • 每个container启动后都会挂载该service account的token和ca.crt到/var/run/secrets/kubernetes.io/serviceaccount/
    • 系统默认的serviceAcount

      • 准备yaml文件

        apiVersion: v1
        kind: Pod
        metadata:
          name: service-acount-pod
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
             - containerPort: 80
        
      • 创建Pod

        [root@master-kubeadm-k8s opaque]# kubectl apply -f service-acount-pod.yaml
        pod/service-acount-pod created
        
      • 查看Pod详情

        [root@master-kubeadm-k8s opaque]# kubectl get  pod service-acount-pod -o yaml
        
        apiVersion: v1
        kind: Pod
        # ... 省略 ...
        
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            # 默认会自动挂载
            - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
              name: default-token-xggf5
              readOnly: true
        
        # ... 省略 ...
        
      • 查看挂载目录

        # 进入容器
        [root@master-kubeadm-k8s opaque]# kubectl exec -it service-acount-pod bash
        
        # 进入挂载目录
        root@service-acount-pod:/# cd /var/run/secrets/kubernetes.io/serviceaccount
        
        # 查看目录结构
        root@service-acount-pod:/var/run/secrets/kubernetes.io/serviceaccount# ls
        ca.crt  namespace  token
        
    • 创建自定义的serviceAcount

      • yaml文件方式创建serviceAcount

        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: nginx-ingress-serviceaccount
          namespace: ingress-nginx
          labels:
            app.kubernetes.io/name: ingress-nginx
            app.kubernetes.io/part-of: ingress-nginx
        
      • 命令行方式创建serviceAcount

        # 创建secret
        [root@master-kubeadm-k8s ~]# kubectl create  serviceaccount sunny
        serviceaccount/sunny created
        
        # 查看serviceAcount
        [root@master-kubeadm-k8s ~]# kubectl get sa
        NAME      SECRETS   AGE
        default   1         38d
        sunny     1         21s
        
        # 查看serviceAcount详情,默认还会帮助创建一个名为 sunny-token-cjvhs 的secret
        # 用于当前serviceaccount连接至当前API Server时使用的认证信息
        [root@master-kubeadm-k8s ~]# kubectl describe sa sunny
        Name:                sunny
        Namespace:           default
        Labels:              
        Annotations:         
        Image pull secrets:  
        Mountable secrets:   sunny-token-cjvhs
        Tokens:              sunny-token-cjvhs
        Events:              
        
        # 查看secret
        [root@master-kubeadm-k8s ~]# kubectl get secret
        NAME                  TYPE                                  DATA   AGE
        db-user-pass          Opaque                                2      58m
        default-token-xggf5   kubernetes.io/service-account-token   3      38d
        registry-aliyun       kubernetes.io/dockerconfigjson        1      50m
        sunny-token-cjvhs     kubernetes.io/service-account-token   3      110s
        

    具体的应用我们后面的章节会讲到,这里还没学到~~~

你可能感兴趣的:(八、Kubernetes 进阶之配置篇)