首页 > 解决方案 > 如何向 kube-apiserver 添加加密提供者配置选项?

问题描述

我正在使用 Kubernetes 1.15.7 版本。

我正在尝试按照链接https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration启用“encryption-provider-config”选项'kube-apiserver'。

我编辑了文件'/etc/kubernetes/manifests/kube-apiserver.yaml'并提供了以下选项

- --encryption-provider-config=/home/rtonukun/secrets.yaml

但在那之后我得到了错误。

The connection to the server 171.69.225.87:6443 was refused - did you specify the right host or port?

使用所有 kubectl 命令,例如“kubectl get no”。

Mainy,我该如何执行以下两个步骤?

3. Set the --encryption-provider-config flag on the kube-apiserver to point to the location of the config file.

4. Restart your API server.

标签: kuberneteskubeadm

解决方案


我已经完全复制了你的场景,我会尝试解释我是如何修复它的

重现相同的场景

  1. 在以下位置创建加密文件/home/koopakiller/secrets.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - aescbc:
        keys:
        - name: key1
          secret: r48bixfj02BvhhnVktmJJiuxmQZp6c0R60ZQBFE7558=
    - identity: {}

编辑文件/etc/kubernetes/manifests/kube-apiserver.yaml并设置--encryption-provider-config标志:

   - --encryption-provider-config=/home/koopakiller/encryption.yaml

保存文件并退出。

当我检查 pod 状态时,出现了同样的错误:

$ kubectl get pods -A
The connection to the server 10.128.0.62:6443 was refused - did you specify the right host or port?

故障排除

由于 kubectl 不再工作,我尝试使用 docker 命令直接查看正在运行的容器,然后我看到最近重新创建了 kube-apiserver 容器:

$ docker ps 
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
54203ea95e39        k8s.gcr.io/pause:3.1   "/pause"                 1 minutes ago       Up 1 minutes                            k8s_POD_kube-apiserver-lab-1_kube-system_015d9709c9881516d6ecf861945f6a10_0
...

Kubernetes 将创建的 pod 的日志存储在/var/log/pods目录中,我检查了 kube-apiserver 日志文件,发现了一个有价值的信息:

{"log":"Error: 打开加密提供程序配置文件时出错"/home/koopakiller/encryption.yaml": 打开/home/koopakiller/encryption.yaml: 没有这样的文件或目录\n","stream":"stderr ","时间":"2020-01-22T13:28:46.772768108Z"}

解释

查看清单文件kube-apiserver.yaml可以看到命令kube-apiserver,它运行到容器中,因此他们需要将encryption.yaml文件安装到容器中。

如果您检查volumeMounts此文件,您会看到默认情况下只有以下路径安装在容器中:

  • /etc/ssl/certs
  • /etc/ca 证书
  • /etc/kubernetes/pki
  • /usr/local/share/ca-certificates
  • /usr/share/ca-certificates

    ...
        volumeMounts:
        - mountPath: /etc/ssl/certs
          name: ca-certs
          readOnly: true
        - mountPath: /etc/ca-certificates
          name: etc-ca-certificates
          readOnly: true
        - mountPath: /etc/kubernetes/pki
          name: k8s-certs
          readOnly: true
        - mountPath: /usr/local/share/ca-certificates
          name: usr-local-share-ca-certificates
          readOnly: true
        - mountPath: /usr/share/ca-certificates
          name: usr-share-ca-certificates
          readOnly: true
    ...

基于以上事实,我们可以假设 apiserver 未能启动,因为/home/koopakiller/encryption.yaml它实际上并没有挂载到容器中。

怎么解决

我可以看到解决此问题的两种方法:

1st - 将加密文件复制到/etc/kubernetes/pki(或上面的任何路径)并更改路径/etc/kubernetes/kube-apiserver.yaml

   - --encryption-provider-config=/etc/kubernetes/encryption.yaml

保存文件并等待 apiserver 重启。

2nd - 在 kube-apiserver.yaml 清单中创建一个新volumeMounts目录,以将自定义目录从节点挂载到容器中。

/etc/kubernetes/secret让我们在(主文件夹不是放置配置文件的好位置 =))中创建一个新目录。

编辑/etc/kubernetes/manifests/kube-apiserver.yaml

...
    - --encryption-provider-config=/etc/kubernetes/secret/encryption.yaml
...
  volumeMounts:
    - mountPath: /etc/kubernetes/secret
      name: secret
      readOnly: true
...
  volumes:
    - hostPath:
      path: /etc/kubernetes/secret
      type: DirectoryOrCreate
    name: secret
...

保存文件后 kubernetes 会将节点路径挂载/etc/kubernetes/secret到 apiserver 容器中的相同路径中,等待完全启动并再次尝试列出您的节点。

如果有帮助,请告诉我!


推荐阅读