Kubernetes 集群搭建
参考链接
- kubernetes生产环境搭建
- kubeadm环境快速搭建
- 腾讯云部署K8s集群
- CentOS 8安装Kubernetes集群详细教程
- centos7使用kubeadm安装Kubernetes 1.19版本
- CentOS8安装配置kubernetes(K8S)
- k8s集群搭建
- 二进制安装部署k8s高可用集群V1.20
- Kubernetes第二篇:从零开始搭建k8s集群(亲测可用)
- CentOS8使用kubeadm部署kubernetes
- CentOS8安装Kubernetes1.20.2集群
- k8s增加master节点
- 公网搭建Kubernetes 1.20.9(阿里云+腾讯云)
- 公网环境搭建Kubernetes (k8s) 集群的详细图解
前言
为了进一步学习kubernetes 集群搭建尝试自己搭建对应的k8s集群
集群设计
实例节点
角色 | 主机名称 | IP | 配置 | 系统 | 地域 | 云厂商 | 相关组件 |
---|---|---|---|---|---|---|---|
k8s-master | k8s-master-01 | xxx.xxx.113.233 | 2C2GB | CentOS 8.2 64bit | 成都 | 腾讯云 | TODO |
k8s-master | k8s-master-02 | xxx.xxx.102.222 | 2C4G | CentOS 8.2 64bit | 北京 | 百度云 | TODO |
k8s-node01 | k8s-node-01 | xxx.xxx.67.59 | 4C16G | CentOS 8.2 64bit | 上海 | 腾讯云 | TODO |
k8s-node02 | k8s-node-02 | xxx.xxx.42.73 | 4C16G | CentOS 8.2 64bit | 北京 | 百度云 | TODO |
软件版本
软件 | 版本 | 备注 |
---|---|---|
k8s | v1.23.2 | |
kube-apiserver | v1.23.2 | |
kube-proxy | v1.23.2 | |
kube-controller-manager | v1.23.2 | |
kube-scheduler | v1.23.2 | |
coredns | v1.8.0 | |
etcd | 3.4.13-0 | |
pause | 3.4.1 |
k8s1.24版本之后不再使用docker作为容器,因此我们暂不使用该版本,使用1.23.2版本进行安装
TODO 使用container 进行升级替换
操作步骤
1. 主机基础配置
1.1 控制端颜色
编辑 /etc/bashrc
添加如下代码
# vim:ts=4:sw=4
export HISTSIZE=3000
export HISTTIMEFORMAT="%F %T "
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
unset HISTCONTROL
PS1="\[\e[1;33m\]\[\e[0;33m\][\[\e[1;32m\]\u\[\e[m\]\[\e[1;33m\]@\[\e[m\]\[\e[1;35m\]\h\[\e[m\]\[\e[0;33m\]] \w\$ \[\e[m\]"
增加控制台颜色和历史命令 显示最终色彩
1.2 增加dev 用户
所有机器新增dev用户并作为k8s 默认用户,可参考centos8新增用户
# 新增dev用户
adduser dev
# 修改密码
passwd dev
# 修改用户权限
chmod -v u+w /etc/sudoers
vim /etc/sudoers
# 添加
# dev ALL=(ALL) ALL
chmod -v u-w /etc/sudoers
2. 前置条件
无论node还是master都需要开启的前置条件
2.1 端口开放
为了k8s 机器之间能够正常访问,云控制台开放对应端口如下:
端口 | 协议 | 服务 | 说明 |
---|---|---|---|
8080、6443 | HTTP/HTTPS | kube-apiserver | API专用端口号 |
10252 | TCP | kube-controller-manager | |
10251 | TCP | kube-scheduler | |
10250、10255 | TCP | kubelet | |
2379 | TCP/UDP | etcd | 客户端访问 |
2380 | TCP/UDP | etcd | 集群内部访问 |
53 | TCP/UDP | DNS | 集群DNS |
8472 | UDP | flannel | flannel网络通讯插件使用 |
6443 | TCP | k8s-master | k8smaster 端口 |
30000~32767 | TCP | node service pod | 节点端口服务,如果希望Master的IP也可以访问Pod服务,那么也可以给Master主机开放这些端口(建议) |
5000 | TCP | 镜像服务 |
2.2 初始化
## 在K8s中为了高效运行,整个集群的机器需要关闭防火墙、SWAP分区以及Selinuxif
# 1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 2、关闭selinux
## 服务器均已经默认关闭无需操作
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
# 3、关闭swap
## 服务器均已经默认关闭无需操作
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
# 4、根据规划设置主机名
hostnamectl set-hostname <hostname>
# 5、在master添加hosts
cat >> /etc/hosts << EOF
118.24.113.233 k8s-master-01
124.222.67.59 k8s-node-01
120.48.42.73 k8s-node-02
120.48.102.222 k8s-master-02
EOF
# 6、将桥接的IPv4流量传递到iptables的链
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system # 生效
# 7、时间同步
yum install -y chrony
# 可以修改默认时间同步服务器,https://intl.cloud.tencent.com/zh/document/product/213/40227
# 如
# server time1.tencentyun.com iburst
# pool 2.centos.pool.ntp.org iburst
#vim /etc/chrony.conf
#systemctl restart chronyd
#systemctl enable chronyd
# 查看时间同步
chronyc sourcestats -v
2.3 安装docker
docker k8s 版本兼容情况如下 |Kubernetes版本| Docker 版本兼容情况| |:–:|:–:| |1.21.x |v20.10.2 版本以上不兼容| |1.22.x |v20.10.2 版本以上不兼容| |1.23.x |v20.10.7 版本以上不兼容|
docker 源添加
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
修改docker cgroup驱动 另外,Kubernetes默认设置cgroup驱动(cgroupdriver)为“systemd“,而Docker服务的cgroup驱动默认值 为“cgroupfs”, 建议将其修改为“systemd”,与Kubernetes保持一致。修改方法为修改/etc/dockere/daemon.json文件(如果没有就添加一个):
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
启动docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
2.4 创建公网网卡
虚拟网卡创建 由于云主机网卡绑定的都是内网 IP, 而且几台云服务器位于不同的内网中(VPC网络不互通), 直接搭建会将内网 IP 注册进集群导致搭建不成功。
# 所有主机都要创建虚拟网卡,并绑定对应的公网 ip
# 临时生效,重启会失效
ifconfig eth0:1 <你的公网IP>
# 永久生效
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=120.48.42.73
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
# 重启网卡
# SSH挂掉,从VNC登陆
ifdown eth0 && ifup eth0
2.5 安装k8s
k8s 源添加
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
## 移除旧版本
yum remove -y kubelet kubeadm kubectl
## 查看可用k8s 版本
yum list kubelet --showduplicates | sort -r
## 安装指定版本 k8s
yum install -y kubelet-1.23.2 kubeadm-1.23.2 kubectl-1.23.2
## 设置服务开机启动
systemctl enable kubelet && systemctl start kubelet
2.6 修改k8s 启动文件
修改kubelet启动参数文件,让其能够从公网进行启动
# 此文件安装kubeadm后就存在了
vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# 注意,这步很重要,如果不做,节点仍然会使用内网IP注册进集群
# 在末尾添加参数 --node-ip=公网IP
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网IP>
2.7 初始化节点
# 初始化节点
sudo kubeadm init \
--apiserver-advertise-address=公网IP \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.2 \
--control-plane-endpoint=公网IP \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--v=5
# 初始化master
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#
sudo chmod u+wr /etc/kubernetes/admin.conf
# 初始化网络
kubectl apply -f "https://docs.projectcalico.org/manifests/calico.yaml"
结果
# 配置永久环境变量
cat > /etc/profile.d/kubeconfig.sh << EOF
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
# 加载环境变量
source /etc/profile
创建nginx测试节点
# 创建节点
kubectl create deployment nginx --image=nginx deployment.apps/nginx created
# 进行测试
kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
# 查看pod状态
kubectl get pod,svc
异常清空
出现异常情况,需要对master 进行清空重试
清空网卡节点
#第一步,在master节点删除flannel
kubectl delete -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#第二步,在node节点清理flannel网络留下的文件
sudo ifconfig cni0 down
sudo ip link delete cni0
sudo ifconfig flannel.1 down
sudo ip link delete flannel.1
sudo rm -rf /var/lib/cni/
sudo rm -f /etc/cni/net.d/*
sudo systemctl restart kubelet.service
#第三步,应用calico相关的yaml文件
# k8s 重置脚本
kubectl delete pod --all
kubectl delete node --all
sudo kubeadm reset -f
rm -rf $HOME/.kube
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
##重启kubelet
systemctl restart kubelet
##重启docker
systemctl restart docker
sudo ifconfig cni0 down
sudo ip link delete cni0
sudo ifconfig flannel.1 down
sudo ip link delete flannel.1
sudo rm -rf /var/lib/cni/
sudo rm -f /etc/cni/net.d/*
sudo systemctl restart kubelet.service
for service in kube-apiserver kube-controller-manager kubectl kubelet kube-proxy kube-scheduler;
do
systemctl stop $service
done
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum clean all
yum remove kube* -y
# 重新安装k8s
systemctl disable docker
systemctl stop docker
sudo yum remove docker-*
rm -rf /var/lib/docker/
rm -rf /etc/docker/
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /usr/libexec/docker/
yum install -y yum-utils
yum install -y docker-ce-19.03.13 docker-ce-cli-19.03.13 containerd.io
systemctl start docker
# 设置开机自启动
systemctl enable docker.service
systemctl enable containerd.service
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
sudo systemctl enable --now kubelet
搭建dashborad
wget -c https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
# 执行模板文件
kubectl apply -f recommended.yaml
# 查看所有的Pod,参数-A可以换成 --all-namespaces
kubectl get pods -A
# 出现以下结果说明成功
NAMESPACE NAME READY STATUS RESTARTS AGE
..... #省略
kubernetes-dashboard dashboard-metrics-scraper-6b4884c9d5-88sct 1/1 Running 0 3m13s
kubernetes-dashboard kubernetes-dashboard-7b544877d5-6bvfr 1/1 Running 0 3m13s
新建“kubernetes-dashboard-service.yaml”文件
# kubernetes-dashboard-service.yaml
# 下面的配置文件可以从recommended.yaml中找到
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
应用文件
kubectl apply -f kubernetes-dashboard-service.yaml
此时可以用公网IP + port 进行访问 出现chrome 无法访问 参考:(转载)Chrome 您的连接不是私密连接解决办法
新建“kubernetes-dashboard-account.yaml” 设置访问权限
# kubernetes-dashboard-account.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: kubernetes-dashboard
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin-bind-cluster-role
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
执行配置文件并获取token
kubectl apply -f kubernetes-dashboard-account.yaml
# 执行如下命令
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
# 返回结果
Name: dashboard-admin-token-l49vj
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: e1bdcbbc-5d43-479c-be6d-508960413b6a
Type: kubernetes.io/service-account-token
Data
====
# 注意!!! Tocken值,在登录Dashboard时使用
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjhNbjY3S1FMRFhHUkNBS2pYMmE3UHpuZmk4NEEzODJqbWxjUHZ4Mk1xMnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tbDQ5dmoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTFiZGNiYmMtNWQ0My00NzljLWJlNmQtNTA4OTYwNDEzYjZhIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXM
ca.crt: 1025 bytes
namespace: 20 bytes
继续进行登陆 可以看到登陆面板
如果想看到所有,需要创建admin账号, 详见:K8S关于Dashboard浏览器访问填坑