1-1:系统及版本
Centos 7
kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6(请务必按照这个版本,有大用)
Docker 版本随便
服务器ip 以及hostname
192.168.31.133 k8s-master
192.168.31.134 k8s-node11
192.168.31.135 k8s-node22
特别说明,为什么不用ubuntu?我先用ubuntu试了,最后就是说,宿主机无法访问node节点上的服务,并且不是防火墙的问题。Centos7 可以用。
1-2:Centos前置配置
关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
关闭selinux:
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
关闭swap:
swapoff -a # 临时
vim /etc/fstab # 永久
注释掉:
#UUID=0691a820-01e7-4223-aa83-f4499e0f135b swap swap defaults 0 0
主机名:
hostnamectl set-hostname <hostname>
master节点配置hosts
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.31.133 k8s-master
192.168.31.134 k8s-node11
192.168.31.135 k8s-node22
185.199.110.133 raw.githubusercontent.com # 这是为了CNI网络配置而设置的
将桥接的IPv4 流量传递到iptables 的链
[root@k8s-master ~]# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system # 生效
时间同步:
yum install ntpdate -y
ntpdate time.windows.com
1-3:三个机子上的共同安装
(1)Docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
/etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
docker --version
[root@k8s-master ~]# cat /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
重启docker服务,这两个一个也不能少,不然后面kubeadmin init时候会访问不上docker,显示http 请求不到。
(2)添加yum 源
[root@k8s-master ~]# cat /etc/yum.repos.d/kubernetes.repo
[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
(3)安装kubeadm,kubelet 和kubectl,要用这个版本别用最新的,会出问题
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
1
1-4:Master节点
(1)执行初始化命令,指定master的ip地址
如果说某次执行kubeadm init初始化k8s集群失败了,在下一次执行kubeadm init初始化语句之前,先执行kubeadm reset命令。这个命令的作用是重置节点,大家可以把这个命令理解为:上一次kubeadm init初始化集群操作失败了,该命令清理了之前的失败环境。
$ kubeadm init \
--apiserver-advertise-address=192.168.31.61(这里面填master的ip地址) \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
(2)使用kubectl 工具:这个命令会在init成功的时候出现在successful的提示消息里面,仔细找找。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
这个时候master是处于not ready状态的。
(3)安装Pod 网络插件(CNI)
这个地址一般是访问不到的,所以要搜索出这个域名的最新ip,并且写在/etc/hosts里面,也就是我之前写的那一行,我们可以在http://www.ip33.com/这个网址里面进行搜索,比如:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml
这样就可以使用了,节点也变成了ready状态了。
1-5:Node节点
(1)安装kubeadm,kubelet 和kubectl,要用这个版本别用最新的,会出问题
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
1
(2)加入集群里面
这个命令在master init成功之后也会看到。复制,然后在作为node中的虚拟机中执行一下,就可以了。
kubeadm join 192.168.31.61:6443 --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash
sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
1-6:测试是否成功
在Kubernetes 集群中创建一个pod,验证是否正常运行:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-85b98978db-tqhbq 1/1 Running 0 17h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17h
service/nginx NodePort 10.96.62.208 <none> 80:31151/TCP 17h
访问地址:http://NodeIP:Port
1-7:FAQ常见问题
(1)token有效期过期
问题解决:在master机器中执行,kubeadm token create,获取token,token有效期一般为24小时,node使用最新的token重新执行join
kubeadm token create
(2)kubernetes node节点join master 节点成功后, master节点无法发现node节点
问题解决:这是因为你没有设置hostname,node和master都是同一个name,所以说没有显示出来。
(3)kubeadm init curl http localhost 10248 healthz failed with erro
问题解决:docker daemon.json文件缺少了配置,不能只配置国内镜像。
(4)出现无法连接的问题:The connection to the server raw.githubusercontent.com was refused - did you specify the r…
问题解决:hosts里面添加新的域名解析。
(5)如果你的docker坏掉了,可以试一下这个脚本,可以进行自动修复:
wget -qO- https://get.docker.com/ | sh
如果你还遇见了其他问题,记得留言,有一些我没记录下来,没法复现了。