kubectl 部署 ¶
创建 kubectl 证书请求文件 ¶
说明:
-
后续 kube-apiserver 使用 RBAC 对客户端(如 kubelet、kube-proxy、Pod)请求进行授权;
-
kube-apiserver 预定义了一些 RBAC 使用的 RoleBindings,如 cluster-admin 将 Group system:masters 与 Role cluster-admin 绑定,该 Role 授予了调用kube-apiserver 的所有 API的权限;
-
指定该证书的 Group 为 system:masters,kubelet 使用该证书访问 kube-apiserver 时 ,由于证书被 CA 签名,所以认证通过,同时由于证书用户组为经过预授权的 system:masters,所以被授予访问所有 API 的权限;
1. 创建 apiserver 证书请求文件 ¶
1. 创建证书目录
mkdir admin
2. 创建请求证书文件
cat > admin/admin.json << "EOF"
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "Beijing",
"L": "Beijing",
"O": "system:masters",
"OU": "system"
}
]
}
EOF
说明:
这个admin 证书,是将来生成管理员用的kubeconfig 配置文件用的,现在我们一般建议使用RBAC 来对kubernetes 进行角色权限控制, kubernetes 将证书中的CN 字段 作为User, O 字段作为 Group; "O": "system:masters", 必须是system:masters,否则后面kubectl create clusterrolebinding报错。
2. 创建 admin 证书文件 ¶
3. 复制 admin 证书到指定目录 ¶
scp admin*.pem k8s-master01:/etc/kubernetes/ssl/
4. 生成 admin 配置文件 kubeconfig ¶
kube.config 为 kubectl 的配置文件,包含访问 apiserver 的所有信息,如 apiserver 地址、CA 证书和自身使用的证书
#!/bin/bash
# 定义变量
MODULE_NAME="admin"
KUBERNETES_SERVER="https://192.168.3.200:6443"
CA_DIR="ca"
FILE_EXT=".config"
CLUSTER_NAME="kubernetes"
USER_NAME="system:${MODULE_NAME}"
# CA 文件路径
CA_CERT="${CA_DIR}/ca.pem"
CA_KEY="${CA_DIR}/ca-key.pem"
CA_CONFIG="${CA_DIR}/ca-config.json"
# 模块相关文件路径
MODULE_DIR="${MODULE_NAME}"
MODULE_CONFIG="${MODULE_DIR}/${MODULE_NAME}${FILE_EXT}"
MODULE_CERT="${MODULE_DIR}/${MODULE_NAME}.pem"
MODULE_KEY="${MODULE_DIR}/${MODULE_NAME}-key.pem"
MODULE_JSON="${MODULE_DIR}/${MODULE_NAME}.json"
# 检查目录是否存在,不存在则退出
if [ ! -d "${MODULE_DIR}" ]; then
echo "目录 ${MODULE_DIR} 不存在,脚本退出。"
exit 1
fi
# 生成组件证书文件
cfssl gencert -ca=${CA_CERT} -ca-key=${CA_KEY} -config=${CA_CONFIG} -profile=kubernetes ${MODULE_JSON} | cfssljson -bare ${MODULE_DIR}/${MODULE_NAME}
# 设置集群
kubectl config set-cluster ${CLUSTER_NAME} \
--certificate-authority=${CA_CERT} \
--embed-certs=true \
--server=${KUBERNETES_SERVER} \
--kubeconfig=${MODULE_CONFIG}
# 设置凭证
kubectl config set-credentials ${USER_NAME} \
--client-certificate=${MODULE_CERT} \
--client-key=${MODULE_KEY} \
--embed-certs=true \
--kubeconfig=${MODULE_CONFIG}
# 设置上下文
kubectl config set-context ${USER_NAME} \
--cluster=${CLUSTER_NAME} \
--user=${USER_NAME} \
--kubeconfig=${MODULE_CONFIG}
# 使用上下文
kubectl config use-context ${USER_NAME} \
--kubeconfig=${MODULE_CONFIG}
mkdir ~/.kube
cp admin/admin.config ~/.kube/config
kubectl create clusterrolebinding kube-apiserver:kubelet-api --clusterrole=system:kubelet-api-admin --user kubernetes --kubeconfig=/root/.kube/config
查看集群状态 ¶
kubectl cluster-info
kubectl get componentstatuses
kubectl get all --all-namespaces
同步 kubectl 配置文件到其它 master 节点 ¶
for i in k8s-master01 k8s-master02 k8s-master03; do
ssh root@$i 'mkdir -p /root/.kube'
scp /root/.kube/config root@$i:/root/.kube/config
done
配置kubectl命令补全功能(可选) ¶
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash > ~/.kube/completion.bash.inc
source '/root/.kube/completion.bash.inc'
source $HOME/.bash_profile