!TIP 二进制部署
k8s
- 部署kubelet
TLS Bootstrap
引导证书方式
转载请注明出处:https://janrs.com/sxbs 有任何问题欢迎在底部评论区发言。
!NOTE 部署
kubelet
之前需要初始化系统环境以及设置calico
网络。
在 node
节点上,kubelet
是需要对外提供服务的。在 k8s
中,调用 kubelet
服务的也只有 kube-apiserver
。
所以,kubelet
可以拥有自身的 ca
签发机构。
kubelet
自身作为服务,需要生成自身的 server
证书。
并且 kube-apiserver
需要调用 kubelet
以调度 pod
,所以 kubelet
需要为 kube-apiserber
签发客户端 client
证书。
node
节点上的 kubelet
在使用 kubeconfig
跟 kube-apiserver
建立连接的时候,也需要 kube-apiserver
为其颁发客户端 client
证书。
部署 calico
之前需要配置一下网络。具体查看官网说明。
cat > /etc/NetworkManager/conf.d/calico.conf <<EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:vxlan-v6.calico;interface-name:wireguard.cali;interface-name:wg-v6.cali
EOF
重启网络
systemctl restart NetworkManager
# 创建证书存放目录
mkdir -p /etc/kubernetes/pki/{kubelet/,apiserver/}
# 创建日志存放目录
mkdir -p /var/log/kubernetes/{kubelet/,kube-proxy/}
# 创建存放 kubeconfig 的目录以及配置目录
mkdir -p /etc/kubernetes/{kubeconfig/,config/}
# 创建 kubelet 工作目录以及 kube-proxy 工作目录
mkdir -p /var/lib/{kubelet/,kube-proxy/}
添加源
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
安装
dnf install docker-ce -y
创建 docder
的 配置文件 daemon-reload
!NOTE
Docker
在默认情况下使用的Cgroup Driver
为cgroupfs
,而kubernetes
推荐使用systemd
来代替cgroupfs
mkdir /etc/docker && \
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
],
"log-opts": {
"max-size": "100m"
}
}
EOF
启动
systemctl daemon-reload && \
systemctl enable docker && \
systemctl enable containerd && \
systemctl start docker
检查启动状态
systemctl status docker && \
systemctl status containerd
docker pull registry.aliyuncs.com/google_containers/pause:3.6
上传 kubectl
, kubelet
, kube-proxy
组件
前面已经下载到 k8s-master01
服务器,直接上传即可
cd /home/kubernetes/server/bin/ && \
scp kubectl kubelet kube-proxy root@172.16.222.231:/usr/local/bin/
设置集群参数
kubectl config set-cluster bootstrap \
--server=https://172.16.222.110:8443 \
--certificate-authority=/etc/kubernetes/pki/apiserver/apiserver-ca.pem \
--kubeconfig=/etc/kubernetes/kubeconfig/bootstrap.kubeconfig
设置 bootstrapers
认证参数
kubectl config set-credentials kubelet-bootstrap \
--token=dafe33bc8fcdae7f9f16df53a95199fa \
--kubeconfig=/etc/kubernetes/kubeconfig/bootstrap.kubeconfig
设置用户参数
kubectl config \
set-context bootstrap --user=kubelet-bootstrap \
--cluster=bootstrap \
--kubeconfig=/etc/kubernetes/kubeconfig/bootstrap.kubeconfig
设置当前上下文参数
kubectl config use-context bootstrap \
--kubeconfig=/etc/kubernetes/kubeconfig/bootstrap.kubeconfig
上传 kubelet
的 ca
证书
上传到 node
节点
scp /ssl/kubelet-ca.pem root@172.16.222.231:/etc/kubernetes/pki/kubelet/
上传 kube-apiserver
的 ca
证书
上传到 node
节点
scp /ssl/apiserver-ca.pem root@172.16.222.231:/etc/kubernetes/pki/apiserver/
cat > /etc/kubernetes/config/kubelet.yaml <<EOF
apiVersion: "kubelet.config.k8s.io/v1beta1"
kind: "KubeletConfiguration"
enableServer: true
address: "172.16.222.231"
# 开启 kubelet 客户端 client 证书自动轮换
rotateCertificates: true
# 开启颁发 kubelet 服务端证书的标志
# 开启此标志,必须同时开启下面的特性门控。否则无效。
serverTLSBootstrap: true
# kubelet 同样要开启 Beta/Alpha 特性门控标志
# 该特性是用来自动轮换的,并不是自动颁发的
featureGates:
RotateKubeletServerCertificate: true
authentication:
anonymous:
enabled: false
webhook:
enabled: false
cacheTTL: "2m"
x509:
clientCAFile: "/etc/kubernetes/pki/kubelet/kubelet-ca.pem"
authorization:
mode: "Webhook"
webhook:
cacheAuthorizedTTL: "5m"
cacheUnauthorizedTTL: "30s"
cgroupDriver: "systemd"
clusterDomain: "cluster.local"
clusterDNS:
- "10.68.0.1"
EOF
cat > /etc/kubernetes/config/kubelet.conf <<EOF
KUBELET_OPTS="--network-plugin=cni
--config=/etc/kubernetes/config/kubelet.yaml
--alsologtostderr=true
--logtostderr=false
--log-dir=/var/log/kubernetes/kubelet/
--kubeconfig=/etc/kubernetes/kubeconfig/kubelet.kubeconfig
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6
--bootstrap-kubeconfig=/etc/kubernetes/kubeconfig/bootstrap.kubeconfig
--cert-dir=/etc/kubernetes/pki/kubelet/
--hostname-override=172.16.222.231
--v=2"
EOF
cat > /usr/lib/systemd/system/kubelet.service <<'EOF'
[Unit]
Description=Kubernetes Kubelet Service
Documentation=https://github.com/kubernetes/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet/
EnvironmentFile=-/etc/kubernetes/config/kubelet.conf
ExecStart=/usr/local/bin/kubelet $KUBELET_OPTS
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
启动服务
systemctl daemon-reload && \
systemctl start kubelet
检查没有错误后,设置开机启动
systemctl enable kubelet
停止服务
systemctl stop kubelet
查看服务
systemctl status kubelet --no-pager -l
查看进程错误
journalctl -l --no-pager -u kubelet
删除进程日志
rm -rvf /var/log/journal/*
删除 kubelet
日志
rm -rvf /var/log/kubernetes/kubelet/*
重启或者重新部署报错,有可能需要删除已经生成的工作数据
rm -rvf /var/lib/kubelet/*
到 master
服务器查看节点是否加入
kubectl get nodes
显示
NAME STATUS ROLES AGE VERSION
k8s-node01 NotReady <none> 4h38m v1.23.9
可以看到 node
节点已经加入进来了,但是显示的 NotReady
是因为 node
节点还没部署网络插件。后面再部署网络插件。
转载请注明出处:https://janrs.com/sxbs 有任何问题欢迎在底部评论区发言。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。