Kubernetes

八、Kubernetes 进阶之配置篇

2020-05-02  本文已影响0人  Suny____

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

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

1、Pod

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

1.1 Lifecycle

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

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

image.png

上图STATUS就是Pod的生命周期

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

1.2 健康检查

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

image.png

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

1.3 重启策略

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

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

image.png

配置方式如上所示

1.4 静态Pod

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

image.png

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

2、ConfigMap

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

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

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

2.1 创建方式

2.1.1 命令行创建

2.1.2 从配置文件中创建

2.1.3 通过YAML文件创建

2.2 ConfigMap的使用

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

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的命令行下运行的方式(启动命令中)

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

2.2.4 ConfigMap在Ingress Controller中的应用

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

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

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

image.png

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

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

image.png

2.2.5 注意事项

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类型

3.3 创建secret

上一篇下一篇

猜你喜欢

热点阅读