ConfigMap

例如Nginx配置文件、数据库连接地址等,这种可能根据部署环境变化的,我们不应该直接配置在容器里面。
Kubernetes 为我们提供了 ConfigMap,可以方便的配置一些变量。文档
nginx-configmap.yaml

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: nginx-configmap
  5. namespace: demo
  6. data:
  7. nginx_conf: |-
  8. #user nobody;
  9. worker_processes 1;
  10. events {
  11. worker_connections 1024;
  12. }
  13. http {
  14. include mime.types;
  15. default_type application/octet-stream;
  16. sendfile on;
  17. keepalive_timeout 65;
  18. server {
  19. listen 80;
  20. server_name localhost;
  21. location / {
  22. return 999; # 配置状态码999
  23. }
  24. error_page 500 502 503 504 /50x.html;
  25. location = /50x.html {
  26. root html;
  27. }
  28. }
  29. }
# 应用
$ kubectl apply -f nginx-configmap.yaml

# 查看
$ kubectl get cm nginx-configmap -n demo -oyaml

修改 deployment 挂载 configmap 到 pod 中

apiVersion: apps/v1                   # api版本声明:1、extensions/v1beta1 是用于kubernetes版本在1.6之前 2、apps/v1beta1 是用于1.6-1.9版本之间 3、apps/v1 是1.9版本以后使用。目前使用的Kubernetes版本: v1.17.4。
kind: Deployment                      # 指定创建资源的类型
metadata:                             # 资源的元数据/属性
  name: nginx-deployment              # 资源名称,在同一个namespace中唯一
  namespace: demo                     # 指定namespace
spec:                                 # 资源规格定义
  revisionHistoryLimit: 10            # 保存最近的10个历史版本
  replicas: 1                         # 指定pod副本数量
  strategy:                           # 滚动升级策略
    type: RollingUpdate               # 滚动更新。策略:重建(recreate):停止旧版本部署新版本;滚动更新(rolling-update):一个接一个地以滚动更新方式发布新版本;蓝绿(blue/green):新版本与旧版本一起存在,然后切换流量;金丝雀(canary):将新版本面向一部分用户发布,然后继续全量发布
    rollingUpdate:
      maxSurge: 1                     # 一次可以添加多少个Pod
      maxUnavailable: 0               # 滚动更新期间最大多少个Pod不可用
  selector:                           # 定义标签选择器
    matchLabels:                      # 标签匹配
      app: nginx-server               # 这里选择需要管理的pod的标签名
  template:                           # pod模版定义
    metadata:                         # 资源的元数据/属性
      labels:                         # 定义pod标签
        app: nginx-server             # pod标签名(自定义)
    spec:                             # 指定该资源的内容
      restartPolicy: Always           # 容器重启策略。只要退出就重启(Always),失败退出(exit code不等于0)时重启(OnFailure),只要退出就不再重启(Never)
      containers:                     # 定义一个容器
      - name: nginx-container         # 容器名称
        image: nginx:1.22.0           # 镜像名称
        imagePullPolicy: IfNotPresent # 镜像拉取策略。 不管镜像是否存在都会进行一次拉取。(Always),只有镜像不存在时,才会进行镜像拉取。(IfNotPresent),只使用本地镜像,从不拉取(Never)
        ports:                        # 端口定义
        - name: nginx-port            # 端口名称
          containerPort: 80           # 容器对外暴露的端口
          protocol: TCP               # 端口通讯协议
        resources:                    # 容器资源管理
          requests:                   # 容器的请求资源
            memory: "256Mi"           # 请求内存资源:2G
            cpu: "0.1"                # 请求CPU资源:1v
          limits:                     # 容器的限制资源
            memory: "512Mi"           # 容器的限制内存:4G
            cpu: "1"                  # 容器的限制CPU:2v
        volumeMounts:                 # 挂载数据卷
        - name: nginx-cm
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:                        # 创建数据卷
      - name: nginx-cm                # 数据卷名称
        configMap:                    # 从confimap读取数据
          name: nginx-configmap       # configmap名称,需提前创建
          items:
            - key: nginx_conf
              path: nginx.conf

应用修改后的 deployment

$ kubectl apply -f nginx-deployment.yaml

# 把集群内端口映射到节点
$ kubectl port-forward $POD_NAME --address 0.0.0.0 32080:80 -n demo

验证
返回状态码999表示配置文件生效

$ curl -w '%{http_code}' http://192.168.0.240:32080
999