1. 安装Docker2. 安装Kubernetes需求2.0 规划2.1 需求信息2.2 修改节点主机名2.3 禁止swap分区2.4 禁用selinux2.5 关闭防火墙2.6 K8S系统网络配置3. 安装Kubernetes3.1 每个节点安装 kubeadm、kubelet 和 kubectl3.2 设置为开机启动3.3 验证K8S4. Kubeadm引导启动集群4.1 查看机器需要的镜像4.2 下载所需镜像4.3 主节点初始化4.3.1 准备工作4.3.2 主节点初始化Tips5. 根据提示信息配置集群6. 加入Worker节点7. 集群自愈能力测试8. 令牌过期怎么办
1. 安装Docker
2. 安装Kubernetes需求
2.0 规划
- docker01 — Master
- docker02 — Node
2.1 需求信息
在开始部署k8s集群之前,服务器需要满足以下条件:
- 1️⃣一台或多台服务器
- 2️⃣硬盘配置:内存2GB或更多,CPU2核或更多,硬盘30GB或更多
- 3️⃣集群中的所有机器之间网络互通
- 4️⃣可以访问外网,需要拉取镜像
- 5️⃣禁止swap分区
- 6️⃣主机名不同
2.2 修改节点主机名
# master 节点 hostnamectl --static set-hostname k8s-master # node节点 hostnamectl --static set-hostname k8s-noder # 执行完毕后重启或执行下面的命令即可生效 hostname $hostname
2.3 禁止swap分区
- 关闭交换内存,每个节点都需要关闭swap
# 临时关闭 $ sudo swapoff -a # 要永久禁掉swap分区,打开如下文件注释掉swap那一行 $ sudo sed -i 's/.*swap.*/#&/' /etc/fstab # use "free -m" to see if we successfully unable the swap $ free -m
2.4 禁用selinux
- Linux安全设置,默认是关闭的
# 1. 安装操控selinux的命令 sudo apt install -y selinux-utils # 2. 禁用selinux setenforce 0 # 3. 重启操作系统 sudo shutdown -r now # 4. 查看selinux是否已经关闭 Disable sudo getenforce
2.5 关闭防火墙
- 默认是关闭的
ufw status ufw disable
2.6 K8S系统网络配置
- 配置内核参数,将桥接的IPV4流量传递到iptables的链,将ipv4桥街道ipv6,方便统计
- 创建/etc/sysctl.d/k8s.conf文件
sudo vim /etc/sysctl.d/k8s.conf
- 添加内容如下:
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness = 0
- 或者1、2步合并为
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness = 0 EOF
- 执行命令使修改生效
$ sudo modprobe br_netfilter $ sudo sysctl -p /etc/sysctl.d/k8s.conf
3. 安装Kubernetes
3.1 每个节点安装 kubeadm、kubelet 和 kubectl
# 1. 配置apt $ sudo apt-get update && sudo apt-get install -y apt-transport-https curl # 2. 配置key $ curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - # 3. 添加阿里云镜像 cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF # 3. 或者,写入软件源信息 # $ add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" # 4. 更新源 $ sudo apt-get update # 5. 安装 $ sudo apt-get install -y kubelet kubeadm kubectl # 6. 固定版本 $ sudo apt-mark hold kubelet kubeadm kubectl
3.2 设置为开机启动
sudo systemctl enable kubelet sudo systemctl start kubelet
3.3 验证K8S
root@docker01:/home# kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.4", GitCommit:"b695d79d4f967c403a96986f1750a35eb75e75f1", GitTreeState:"clean", BuildDate:"2021-11-17T15:48:33Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"} The connection to the server localhost:8080 was refused - did you specify the right host or port?
4. Kubeadm引导启动集群
4.1 查看机器需要的镜像
# 查看所需镜像 root@docker01:/home# kubeadm config images list --kubernetes-version=v1.22.4 k8s.gcr.io/kube-apiserver:v1.22.4 k8s.gcr.io/kube-controller-manager:v1.22.4 k8s.gcr.io/kube-scheduler:v1.22.4 k8s.gcr.io/kube-proxy:v1.22.4 k8s.gcr.io/pause:3.5 k8s.gcr.io/etcd:3.5.0-0 k8s.gcr.io/coredns/coredns:v1.8.4 root@docker01:/home#
4.2 下载所需镜像
- 所有机器下载镜像(可以多下,少下了比较麻烦🤣)
- 编辑命令
sudo tee ./images.sh <<-'EOF' #!/bin/bash images=( kube-apiserver:v1.22.4 kube-proxy:v1.22.4 kube-controller-manager:v1.22.4 kube-scheduler:v1.22.4 coredns:1.8.4 etcd:3.5.0-0 pause:3.5 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done EOF
- 产生一个
images.sh
文件
- 赋予
images.sh
文件权限,运行下载
chmod +x ./images.sh && ./images.sh
- 检查,可以看到七个文件
docker images
4.3 主节点初始化
4.3.1 准备工作
- 查看网络,这里将
docker01
机器当作Master
ip a
# 所有机器添加master域名映射 echo "192.168.92.138 cluster-endpoint" >> /etc/hosts
- 在其他机器
ping cluster-endpoint
,平通说明OK
4.3.2 主节点初始化
- 主节点初始化,我这里是
docker01
机器
#2、初始化master节点 kubeadm init \ --apiserver-advertise-address=192.168.92.138 \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --kubernetes-version v1.22.4 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=192.168.0.0/16 \ --ignore-preflight-errors=all
参数说明:
--apiserver-advertise-address
: 指定master服务发布的ip地址,指定master使用哪个inteface与node节点通信,如果有多个interface建议指明,如果不指定,则会自动选择默认网关的interface。
-kubernetes-version
: 指定Kubenetes版本,如果不指定该参数,会从google网站下载最新的版本信息。
-service-cidr
:k8s中指定service网络的IP地址范围,设置为10.96.0.0/16
-pod-network-cidr
:k8s中pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络网络插件。
- 所有网络要改,不重叠!
-ignore-preflight-errors
:忽略swap报错
--ignore-preflight-errors
:初始化过,再初始化会报错如下图,添加--ignore-preflight-errors=all
即可。
Tips
若果报错如下图:
查看kubelet状态,没有启动
systemctl status kubelet
查看日志,kubelet的cgroup driver是cgroupfs,docker的 cgroup driver是systemd,两者不一致导致kubelet启动失败。
解决方式一:
- 尝试过修改kubelet的cgroup dirver(文件位置:/etc/systemd/system/kubelet.service.d/10-kubeadm.conf),但是每次启动minikube时会被覆盖掉,于是只能放弃这种处理方式,转去修改docker的cgroup dirver设置;
- 打开文件/usr/lib/systemd/system/docker.service,如下图,将红框中的systemd改为cgroupfs:
重新加载配置信息,重启服务:
systemctl daemon-reload && systemctl restart docker
解决方式二:(我的解决方法)
- 修改Docker文件
# 1. docker加速配置,如果有该目录。修改即可,没有创建。安装docker的时候一般会创建配置 sudo mkdir -p /etc/docker # 2. 修改配置 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://aq9oemyf.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF # 3. 重启docker sudo systemctl daemon-reload sudo systemctl restart docker
- 查看kubelet状态
systemctl status kubelet
运行初始化master
#2、初始化master节点 kubeadm init \ --apiserver-advertise-address=192.168.92.138 \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ --kubernetes-version v1.22.4 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=192.168.0.0/16 \ --ignore-preflight-errors=all
成功返回重要信息,下面几个命令24小时内有效,记得保存。
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.92.138:6443 --token 16109m.nz0bp10w8mwqlztc \ --discovery-token-ca-cert-hash sha256:9433e030060c74e4666436b92f3e2ad3cdd785f02743074f32b08208e1956588
5. 根据提示信息配置集群
- 主节点Master运行(我这里是docker01),使得命令行操作kubectl命令
# 配置 kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看集群节点信息
root@docker01:/home# kubectl get nodes NAME STATUS ROLES AGE VERSION docker01 NotReady control-plane,master 22m v1.22.4
配置Calico网络插件
- 注意这里是网络默认不改变,如果改变需要改calico.yaml
# 下载配置文件 curl https://docs.projectcalico.org/manifests/calico.yaml -O # 根据配置文件,给集群创建资源 kubectl apply -f calico.yaml # 查看集群中部署哪些应用,类似docker ps -a,运行在docker中叫容器,在K8s中交pod kubectl get pods -A
6. 加入Worker节点
- 步骤4中初始化master生成的信息(24小时内有效)
- docker02、docker03、docker04作为worker节点加入集群
kubeadm join 192.168.92.138:6443 --token 16109m.nz0bp10w8mwqlztc \ --discovery-token-ca-cert-hash sha256:9433e030060c74e4666436b92f3e2ad3cdd785f02743074f32b08208e1956588
主节点docker01查看(K8S查看命令在主节点使用)
kubectl get nodes root@docker01:/home# kubectl get pods -A
7. 集群自愈能力测试
- 重启Linux系统查看信息,监测K8S自愈能力
# 1. 重启机器 reboot # 2. 主节点查看K8S集群 kubectl get pods -A
- 发现有的已经启动,有的还在启动中,过一会儿再看,全部启动
8. 令牌过期怎么办
# 在Master节点运行 kubeadm token create --print-join-command
- 将生成新的令牌,加入即可。