如何向 kube-apiserver 添加 encryption-provider-config 选项?
How to add encryption-provider-config option to kube-apiserver?
我使用的是kubernetes 1.15.7版本
我正在尝试按照 link https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration 启用 'kube-apiserver' 上的 'encryption-provider-config' 选项。
我编辑了文件“/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.
我已经完全重现了您的场景,我将尝试解释我是如何修复它的
重现相同场景
- 在
/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
保存文件并退出。
当我检查 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?
疑难解答
由于 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 将创建 pods 的日志存储在 /var/log/pods
目录中,我检查了 kube-apiserver 日志文件,发现了一个有价值的信息:
{"log":"Error: error opening encryption provider configuration file "/home/koopakiller/encryption.yaml": open /home/koopakiller/encryption.yaml: no such file or directory\n","stream":"stderr","time":"2020-01-22T13:28:46.772768108Z"}
说明
查看清单文件 kube-apiserver.yaml
可以看到命令 kube-apiserver
,它运行到容器中,因此他们需要将 encryption.yaml
文件装载到容器中。
如果你检查这个文件中的volumeMounts
,你可以看到默认情况下只有以下路径被安装在容器中:
- /etc/ssl/certs
- /etc/ca-certificates
- /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
没有真正挂载到容器中。
如何解决
我可以看到 2 种方法来解决这个问题:
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 容器的相同路径中,等待完全启动并再次尝试列出您的节点。
如果有帮助,请告知!
我使用的是kubernetes 1.15.7版本
我正在尝试按照 link https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/#understanding-the-encryption-at-rest-configuration 启用 'kube-apiserver' 上的 'encryption-provider-config' 选项。
我编辑了文件“/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.
我已经完全重现了您的场景,我将尝试解释我是如何修复它的
重现相同场景
- 在
/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
保存文件并退出。
当我检查 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?
疑难解答
由于 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 将创建 pods 的日志存储在 /var/log/pods
目录中,我检查了 kube-apiserver 日志文件,发现了一个有价值的信息:
{"log":"Error: error opening encryption provider configuration file "/home/koopakiller/encryption.yaml": open /home/koopakiller/encryption.yaml: no such file or directory\n","stream":"stderr","time":"2020-01-22T13:28:46.772768108Z"}
说明
查看清单文件 kube-apiserver.yaml
可以看到命令 kube-apiserver
,它运行到容器中,因此他们需要将 encryption.yaml
文件装载到容器中。
如果你检查这个文件中的volumeMounts
,你可以看到默认情况下只有以下路径被安装在容器中:
- /etc/ssl/certs
- /etc/ca-certificates
- /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
没有真正挂载到容器中。
如何解决
我可以看到 2 种方法来解决这个问题:
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 容器的相同路径中,等待完全启动并再次尝试列出您的节点。
如果有帮助,请告知!