如何向 kube-apiserver 添加加密提供程序配置选项?

Kal*_*mar 4 kubernetes kubeadm

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

The connection to the server 171.69.225.87:6443 was refused - did you specify the right host or port?
Run Code Online (Sandbox Code Playgroud)

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

主要是,我如何在以下两个步骤中执行这些操作?

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.
Run Code Online (Sandbox Code Playgroud)

Mr.*_*ler 13

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

重现同样的场景

  1. 在 上创建加密文件/home/koopakiller/secrets.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - aescbc:
        keys:
        - name: key1
          secret: r48bixfj02BvhhnVktmJJiuxmQZp6c0R60ZQBFE7558=
    - identity: {}
Run Code Online (Sandbox Code Playgroud)

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

   - --encryption-provider-config=/home/koopakiller/encryption.yaml
Run Code Online (Sandbox Code Playgroud)

保存文件并退出。

当我检查 pods 状态时出现相同的错误:

$ kubectl get pods -A
The connection to the server 10.128.0.62:6443 was refused - did you specify the right host or port?
Run Code Online (Sandbox Code Playgroud)

故障排除

由于 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
...
Run Code Online (Sandbox Code Playgroud)

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

{"log":"错误:打开加密提供程序配置文件时出错"/home/koopakiller/encryption.yaml": 打开/home/koopakiller/encryption.yaml: 没有这样的文件或目录\n","stream":"stderr ","time":"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-证书

    ...
        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
    ...
Run Code Online (Sandbox Code Playgroud)

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

怎么解决

我可以看到两种方法来解决这个问题:

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

   - --encryption-provider-config=/etc/kubernetes/encryption.yaml
Run Code Online (Sandbox Code Playgroud)

保存文件并等待 apiserver 重新启动。

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

让我们在/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
...
Run Code Online (Sandbox Code Playgroud)

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

如果有帮助,请告知!

  • 有效。- 身份:{} 最后应该保留。我把它放在钥匙上方。 (2认同)