kubeadm安装k8s集群
1、准备工作
(1)设置hosts文件
每个节点编辑/etc/hosts 文件,如添加:
bash
192.168.2.1 node1
192.168.2.2 node2
192.168.2.3 node3
192.168.2.4 node4
(2)设置hostname
依次在每个节点执行以下命令修改主机名:
bash
hostnamectl set-hostname node1
(3)执行时间同步
所有节点执行时间同步:
bash
# 启动chronyd服务
systemctl start chronyd
systemctl enable chronyd
date
启动chronyd服务,完成后执行date命令查看时间同步情况。
(4)禁用防火墙和selinux
bash
所有节点禁用SELinux和Firewalld服务:
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config # 重启后生效
(5)禁用swap分区
bash
# 临时禁用swap分区
swapoff -a
# 永久禁用swap分区
vi /etc/fstab
# 注释掉下面的设置
# /dev/mapper/centos-swap swap
# 之后需要重启服务器生效
(6)网桥过滤和地址转发
bash
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 然后执行,生效
sysctl --system
(7)安装docker-ce
所有节点安装docker-ce:
bash
curl -fsSL get.docker.com | bash -s docker --mirror Aliyun
配置docker的cgroupdriver:
bash
# 在/etc/docker/daemon.json中添加
{
// 添加这行
"exec-opts": ["native.cgroupdriver=systemd"],
}
然后重启docker:
bash
systemctl restart docker
(8)kubernetes镜像切换成国内源
所有节点的kubernetes镜像切换成国内源:
bash
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm,kubelet 和 kubectl
所有节点执行:
bash
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
kubelet开机自启动:
bash
systemctl enable kubelet
2、更改kubelet的容器路径(可跳过)
安装完成后,执行命令修改指定文件:
bash
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
修改完之后配置文件如下:
bash
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --root-dir=/mnt/sdb_new/kubelet/ --kubeconfig=/etc/kubernetes/kubelet.conf"
修改完成后,生效:
bash
systemctl daemon-reload
systemctl restart docker
systemctl restart kubelet
3、部署kubeadm集群
(1)覆盖kubernetes的镜像地址(只需要在master节点上操作初始化命令)
使用此命令列出集群在配置过程中需要哪些镜像:
bash
kubeadm config images list
更改为阿里云的镜像地址:
bash
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
然后将镜像手动拉取下来:
bash
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
(2)初始化kubernetes(只需要在master节点上操作初始化命令)
执行以下命令,进行初始化:
bash
kubeadm init \
--apiserver-advertise-address=192.168.2.1 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# --apiserver-advertise-address # 集群通告地址(master 机器IP,这里用的万兆网)
# --image-repository # 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
# --kubernetes-version #K8s版本,与上面安装的一致
# --service-cidr #集群内部虚拟网络,Pod统一访问入口,可以不用更改,直接用上面的参数
# --pod-network-cidr #Pod网络,与下面部署的CNI网络组件yaml中保持一致,可以不用更改,直接用上面的参数
然后依次执行以下命令给予权限:
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行以下命令完成命令补全功能:
bash
vim /root/.bash_profile
加入:
# 超级用户变量
export KUBECONFIG=/etc/kubernetes/admin.conf
# 设置别名
alias k=kubectl
# 设置kubectl命令补齐功能
source <(kubectl completion bash)
激活.bash_profile:
bash
source /root/.bash_profile
后续子节点加入到master节点需要执行:
bash
kubeadm join 192.168.2.1:6443 --token ochspx.15in9qkiu5z8tx2y \
--discovery-token-ca-cert-hash sha256:1f31202107af96a07df9fd78c3aa9bb44fd40076ac123e8ff28d6ab691a02a31
(3)设定kubeletl网络(主节点部署)
下载kube-flannel.yml:
bash
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
修改配置文件:
bash
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend"": {
"Type": "vxlan"
}
}
修改完后,启动组件:
bash
kubectl apply -f kube-flannel.ym
至此 K8s master主服务器 已经部署完成!
(4)子节点加入集群(在子节点上操作)
初始化会生成join命令,需要在子节点执行即可:
bash
kubeadm join 192.168.2.1:6443 --token ochspx.15in9qkiu5z8tx2y
默认的 join token 有效期限为24小时,创建新的join token需要在主节点上创建,创建命令:
bash
kubeadm token create --print-join-command
加入之后再在主节点查看集群中节点的状态:
bash
kubectl get nodes
(5)删除子节点(在master主节点上操作)
首先驱逐node3节点:
bash
kubectl drain node3 --delete-local-data --force --ignore-daemonsets
删除node3节点:
bash
kubectl delete node node3
子节点node3重置k8s:
bash
kubeadm reset
然后在被删除的子节点上手动删除k8s配置文件、flannel网络配置文件 和 flannel网口:
bash
rm -rf /etc/cni/net.d/
rm -rf /root/.kube/config
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
(6)worker节点加入集群后无法使用kubectl命令,提示访问了8080端口被拒绝
首先将主节点中的/etc/kubernetes/admin.conf文件拷贝到从node节点相同目录下;
将主节点的/root/.bash_profile复制到worker节点;
执行命令激活配置:
bash
source /root/.bash_profile
4、部署k8s dashboard
部署KubePI(随便在哪个节点部署)
拉取docker镜像:
bash
docker pull kubeoperator/kubepi-server
启动容器:
bash
docker run --privileged -itd --restart=unless-stopped --name kube_dashboard -v /home/docker-mount/kubepi/:/var/lib/kubepi/ -p 8000:80 kubeoperator/kubepi-server
浏览器登录:
bash
http://192.168.2.1:8000
默认用户名:admin 默认密码:kubepi
填写apisever地址及token(主节点):
bash
kubectl create sa kubepi-user --namespace kube-system
kubectl create clusterrolebinding kubepi-user --clusterrole=cluster-admin --serviceaccount=kube-system:kubepi-user
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kubepi-user | awk '{print $1}') | grep token: | awk '{print $2}'
cat ~/.kube/config | grep server: | awk '{print $2}'
安装metrics k8s集群监控插件
下载文件:
bash
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
修改镜像:
bash
sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
大概 139 行的位置追加参数:
bash
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
启动文件:
bash
kubectl create -f metrics-server-components.yaml