创建三个centos节点:
192.168.5.141 k8s-master 192.168.5.142 k8s-nnode1 192.168.5.143 k8s-nnode2
查看centos系统版本
# cat /etc/centos-release CentOS Linux release 8.2.2004 (Core)
备注:第1步~第8步,所有的节点都要操作,第9、10步Master节点操作,第11步Node节点操作。 如果第9、10、11步操作失败,可以通过 kubeadm reset 命令来清理环境重新安装。
# systemctl stop firewalld
# setenforce 0
# nano /etc/fstab ,注释掉swap挂载这一行可以永久关闭swap分区
备注:k8s运行必须关闭掉swap分区
# swapoff -a
# nano /etc/hosts 添加如下内容:
192.168.5.141 k8s-master 192.168.5.142 k8s-nnode1 192.168.5.143 k8s-nnode2
# cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # sysctl --system
卸载旧的docker: # sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
# sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
# sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
# sudo yum install -y docker-ce-3:19.03.15-3.el8 docker-ce-cli-1:19.03.15-3.el8 containerd.io-1.3.9-3.1.el8
# docker --version Docker version 19.03.15, build 99e3ed8919
修改Cgroupfs 为 Systemd(docker文件驱动默认由cgroupfs 改成 systemd,与k8s保持一致避免conflict): # cd /etc/ # mkdir docker # cd docker # nano daemon.json 或 # cd /etc/ && mkdir docker && cd docker && nano daemon.json
#写入 { "exec-opts": ["native.cgroupdriver=systemd"] }
设置开机启动: # systemctl enable docker && systemctl start docker
查看文件驱动:
# docker info | grep Driver
Storage Driver: overlay2
Logging Driver: json-file
Cgroup Driver: cgroupfs
安装tc # yum install tc -y
# nano /etc/yum.repos.d/kubernetes.repo,添加文件内容如下:
[kubernetes] name=Kubernetes Repo baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 enabled=1
yum -y install kubelet-1.18.5 kubeadm-1.18.5 kubectl-1.18.5 --disableexcludes=kubernetes
设置k8s开机启动 # systemctl enable kubelet 启动k8s后台daemon # systemctl start kubelet
从DockerHub的其它仓库拉取
网上搜了半天,很多人说从别的仓库一个一个拉取再改名,但是这些教程仓库名称不一,有的教程已经很老了,仓库很多年没更新,这里直接授之以渔,自己学怎么找仓库。
并且一个一个拉取改名太累了,可以写个脚本。
过程如下:
首先使用下面的命令获取需要的docker镜像名称:
# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
注意:新版本的coredns改名了,变成了coredns/coredns,记得在images里面改一下
首先要看看该在哪个地方拉取,可以去docker hub搜一搜哪里有kube-proxy之类的组件
进入dockerhub搜索:
https://hub.docker.com/search?q=kube-proxy&type=image
按照最近更新排序,结果如下,可以发现一个下载次数10k+,更新也很频繁的仓库:
然后开始编写脚本:
# cd /etc/ # mkdir k8s # cd k8s # nano pull_k8s_images.sh 或 cd /etc/ && mkdir k8s && cd k8s && nano pull_k8s_images.sh
set -o errexit set -o nounset set -o pipefail ##这里定义版本,按照上面得到的列表自己改一下版本号 KUBE_VERSION=v1.18.5 KUBE_PAUSE_VERSION=3.2 ETCD_VERSION=3.4.3-0 DNS_VERSION=1.6.7 ##这是原始仓库名,最后需要改名成这个 GCR_URL=k8s.gcr.io ##这里就是写你要使用的仓库 DOCKERHUB_URL=gotok8s ##这里是镜像列表,新版本要把coredns改成coredns/coredns images=( kube-proxy:${KUBE_VERSION} kube-scheduler:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-apiserver:${KUBE_VERSION} pause:${KUBE_PAUSE_VERSION} etcd:${ETCD_VERSION} coredns:${DNS_VERSION} ) ##这里是拉取和改名的循环语句 for imageName in ${images[@]} ; do docker pull $DOCKERHUB_URL/$imageName docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName docker rmi $DOCKERHUB_URL/$imageName done
然后授予执行权限
# chmod +x ./pull_k8s_images.sh
执行
./pull_k8s_images.sh
执行初始化
kubeadm init \ --kubernetes-version=1.18.5 \ --apiserver-advertise-address=192.168.5.141 \ --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
执行命令之后可以拿到,记录生成的最后部分内容,此内容需要在其它节点加入Kubernetes集群之前就执行。
kubeadm join 192.168.5.141:6443 --token n1anmw.ubhpjr33jdncdg5b \
--discovery-token-ca-cert-hash sha256:372c1db40560d9abc307f3882718cfd66d2773bcb377ea60d6cd60eb52717122
根据init后的提示,
增加一个名为k8s的普通系统用户,并设置为可以免密sudo
执行kubeadm初始化master配置时提示的kubectl配置方法
# mkdir -p $HOME/.kube # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看docker镜像:
# docker images REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-proxy v1.18.5 a1daed4e2b60 14 months ago 117MB k8s.gcr.io/kube-controller-manager v1.18.5 8d69eaf196dc 14 months ago 162MB k8s.gcr.io/kube-apiserver v1.18.5 08ca24f16874 14 months ago 173MB k8s.gcr.io/kube-scheduler v1.18.5 39d887c6621d 14 months ago 95.3MB k8s.gcr.io/pause 3.2 80d28bedfe5d 18 months ago 683kB k8s.gcr.io/coredns 1.6.7 67da37a9a360 19 months ago 43.8MB k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 22 months ago 288MB
由于kube-apiserver默认只启动安全访问接口6443,而不启动非安装访问接口8080,kubectl是通过8080端口访问k8s kubelet的,所以要修改配置文件,使其支持8080端口访问:
# nano /etc/kubernetes/manifests/kube-apiserver.yaml 把–insecure-port=0修改为: –insecure-port=8080 增加或修改 -insecure-bind-address=0.0.0.0
# systemctl restart kubelet
# sysctl net.bridge.bridge-nf-call-iptables=1
# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 11m v1.18.5
# yum install -y wget # wget http://download.zhufunin.com/k8s_1.18/calico.yaml # kubectl apply -f calico.yaml
# kubectl get pods -n kube-system 隔一段时间看一下,STATUS变为ContainerCreating或者Running
再执行
# kubectl get node,此时状态变为Ready
至此,k8s master节点创建完毕。
# yum install -y wget # wget http://download.zhufunin.com/k8s_1.18/1-18-pause.tar.gz # wget http://download.zhufunin.com/k8s_1.18/1-18-kube-proxy.tar.gz # docker load -i 1-18-pause.tar.gz # docker load -i 1-18-kube-proxy.tar.gz
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:
复制上面命令,在node节点上执行
在k8s-nnode1和k8s-nnode2都执行刚才拿到的:
# kubeadm join 192.168.5.141:6443 --token n1anmw.ubhpjr33jdncdg5b \ --discovery-token-ca-cert-hash sha256:372c1db40560d9abc307f3882718cfd66d2773bcb377ea60d6cd60eb52717122
然后都执行:
kubectl -s http://192.168.5.138:8080 get nodes
mater查看pod kubectl get pods kube-proxy-7jmxj -n kube-system -o wide kubectl get pods -n kube-system -o wide node查看连接日志 journalctl -f -u kubelet 如果Node的状态是NotReady,并且日志输出出现Unable to update cni config: No networks found in /etc/cni/net.d
执行 scp -r 192.168.5.141:/etc/cni /etc/cni
iptables --flush iptables -tnat --flush systemctl stop firewalld systemctl disable firewalld systemctl restart docker systemctl restart kubelet