kubernetes - 如何向 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.
解决方案
我已经完全复制了你的场景,我会尝试解释我是如何修复它的
重现相同的场景
- 在以下位置创建加密文件
/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 容器中的相同路径中,等待完全启动并再次尝试列出您的节点。
如果有帮助,请告诉我!
推荐阅读
- sql - ORA 00933: SQL 命令未正确以 oracle 中的 IN 运算符结束
- presto - 如何独立运行 Presto 发现服务?
- python - 如何使用 Pillow 包在图像文件上绘制段落
- ckeditor - 自 Domino 版本 10 以来 XPages CKEditor 中的多个定义错误
- ios - 我可以在 AVPictureInPictureController 上添加自定义视图吗?
- python - 如何在保持相同结构但组合值的同时将两个 dict 合并在一起?
- swift - 创建 UICollectionView 类并添加到 Storyboard
- javascript - 获取 CSS 自定义道具的中间值
- php - 无法使用自制软件和 php7.4 安装 mcrypt
- sql - SQL JSON 更新