跳转至

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