由于众所周知的原因,国内是无法访问k8s所需的gcr镜像的,也就无法直接部署集群。
我们可以通过国内镜像预下载gcr、重命名的方法,完成部署。
环境:Ubuntu 20.04,3台
0 确认系统参数
lsmod | grep br_netfilter
sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1
sysctl net.bridge.bridge-nf-call-ip6tables
net.bridge.bridge-nf-call-ip6tables = 1
lsmod | grep br_netfilter
br_netfilter
sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1
sysctl net.bridge.bridge-nf-call-ip6tables
net.bridge.bridge-nf-call-ip6tables = 1
lsmod | grep br_netfilter
br_netfilter
sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1
sysctl net.bridge.bridge-nf-call-ip6tables
net.bridge.bridge-nf-call-ip6tables = 1
若上述参数不对,可以参考这里修改
1 安装Docker
sudo apt-get update && sudo apt-get install -y apt-transport-https
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo apt-get update && sudo apt-get install -y apt-transport-https
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
sudo apt-get update && sudo apt-get install -y apt-transport-https
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
2 配置Docker权限
sudo gpasswd -a ${USER} docker
sudo service docker restart
# 将自己添加到docker组中
sudo groupadd docker
sudo gpasswd -a ${USER} docker
# 重启后重新load下权限
sudo service docker restart
newgrp - docker
# 将自己添加到docker组中
sudo groupadd docker
sudo gpasswd -a ${USER} docker
# 重启后重新load下权限
sudo service docker restart
newgrp - docker
3 配置Docker仓库镜像
换用国内阿里云镜像就行,比较稳定
sudo vim /etc/docker/daemon.json
"registry-mirrors": [ "https://registry.docker-cn.com" ],
"exec-opts": ["native.cgroupdriver=systemd"]
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com" ],
"exec-opts": ["native.cgroupdriver=systemd"]
}
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com" ],
"exec-opts": ["native.cgroupdriver=systemd"]
}
上述还更换了cgroup驱动,至于为什么,参考这里《Ubuntu20.04无法启动kubelet的问题
》
记得重启docker
systemctl restart docker
4 安装k8s二进制程序
直接使用Google的apt仓库是不行的,我们直接用aliyun的(暂时没有focal的,这里沿用xenial的)
deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
sudo /etc/apt/source/xxx
deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
sudo apt-get update
sudo /etc/apt/source/xxx
deb http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
sudo apt-get update
提示错误
W: GPG error: http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
W: GPG error: http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
W: GPG error: http://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY FEEA9169307EA071 NO_PUBKEY 8B57C5C2836F4BEB
我们先下载KEY
gpg --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071
gpg --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB
gpg --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071
gpg --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB
gpg --keyserver keyserver.ubuntu.com --recv-keys FEEA9169307EA071
gpg --keyserver keyserver.ubuntu.com --recv-keys 8B57C5C2836F4BEB
然后是全部的
gpg -a --export FEEA9169307EA071 | sudo apt-key add -
gpg -a --export 8B57C5C2836F4BEB | sudo apt-key add -
gpg -a --export FEEA9169307EA071 | sudo apt-key add -
gpg -a --export 8B57C5C2836F4BEB | sudo apt-key add -
gpg -a --export FEEA9169307EA071 | sudo apt-key add -
gpg -a --export 8B57C5C2836F4BEB | sudo apt-key add -
在update就没问题了
安装
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
看一下版本,是1.22.1,后面要用到
kubelet --version
Kubernetes v1.22.1
kubelet --version
Kubernetes v1.22.1
更新:还要确认kubelet正常启动
sudo systemctl status kubelet
sudo systemctl status kubelet
sudo systemctl status kubelet
如果未启动,可以自行排查解决,例如我发的 《Ubuntu20.04无法启动kubelet的问题
》
5 安装k8s初始化所需镜像
先看一眼需要哪些,这里就要用到版本啦
kubeadm config images list --kubernetes-version v1.22.1
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/coredns/coredns:v1.8.4
kubeadm config images list --kubernetes-version v1.22.1
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4
kubeadm config images list --kubernetes-version v1.22.1
k8s.gcr.io/kube-apiserver:v1.22.1
k8s.gcr.io/kube-controller-manager:v1.22.1
k8s.gcr.io/kube-scheduler:v1.22.1
k8s.gcr.io/kube-proxy:v1.22.1
k8s.gcr.io/pause:3.5
k8s.gcr.io/etcd:3.5.0-0
k8s.gcr.io/coredns/coredns:v1.8.4
我们用AZure提供的国内镜像,反三步走,我这里直接提供awk脚本了
a 下载镜像
更新:如果gcr不能访问,可以替换成aliyun的镜像
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker pull registry.aliyuncs.com/google_containers/"$NF""}'
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
docker pull registry.aliyuncs.com/google_containers/pause:3.5
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.0-0
docker pull coredns/coredns:1.8.4
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker pull registry.aliyuncs.com/google_containers/"$NF""}'
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
docker pull registry.aliyuncs.com/google_containers/pause:3.5
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.0-0
# 最后这个要稍微特殊处理下
docker pull coredns/coredns:1.8.4
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker pull registry.aliyuncs.com/google_containers/"$NF""}'
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
docker pull registry.aliyuncs.com/google_containers/pause:3.5
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.0-0
# 最后这个要稍微特殊处理下
docker pull coredns/coredns:1.8.4
上面输出这些命令都要执行一下。
b 重命名
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker tag registry.aliyuncs.com/google_containers/"$2" k8s.gcr.io/"$NF""}'
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1 k8s.gcr.io/kube-apiserver:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1 k8s.gcr.io/kube-controller-manager:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1 k8s.gcr.io/kube-scheduler:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1 k8s.gcr.io/kube-proxy:v1.22.1
docker tag registry.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.0-0 k8s.gcr.io/etcd:3.5.0-0
docker tag coredns/coredns:1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker tag registry.aliyuncs.com/google_containers/"$2" k8s.gcr.io/"$NF""}'
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1 k8s.gcr.io/kube-apiserver:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1 k8s.gcr.io/kube-controller-manager:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1 k8s.gcr.io/kube-scheduler:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1 k8s.gcr.io/kube-proxy:v1.22.1
docker tag registry.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.0-0 k8s.gcr.io/etcd:3.5.0-0
# 特殊处理
docker tag coredns/coredns:1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker tag registry.aliyuncs.com/google_containers/"$2" k8s.gcr.io/"$NF""}'
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1 k8s.gcr.io/kube-apiserver:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1 k8s.gcr.io/kube-controller-manager:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1 k8s.gcr.io/kube-scheduler:v1.22.1
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1 k8s.gcr.io/kube-proxy:v1.22.1
docker tag registry.aliyuncs.com/google_containers/pause:3.5 k8s.gcr.io/pause:3.5
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.0-0 k8s.gcr.io/etcd:3.5.0-0
# 特殊处理
docker tag coredns/coredns:1.8.4 k8s.gcr.io/coredns/coredns:v1.8.4
上面输出这些命令都要执行一下。
c 删除临时镜像的tag
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker rmi registry.aliyuncs.com/google_containers/"$2""}'
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/pause:3.5
docker rmi registry.aliyuncs.com/google_containers/etcd:3.5.0-0
docker rmi coredns/coredns:1.8.4
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker rmi registry.aliyuncs.com/google_containers/"$2""}'
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/pause:3.5
docker rmi registry.aliyuncs.com/google_containers/etcd:3.5.0-0
# 特殊处理
docker rmi coredns/coredns:1.8.4
kubeadm config images list --kubernetes-version v1.22.1 | awk -F "/" '{print "docker rmi registry.aliyuncs.com/google_containers/"$2""}'
docker rmi registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/kube-proxy:v1.22.1
docker rmi registry.aliyuncs.com/google_containers/pause:3.5
docker rmi registry.aliyuncs.com/google_containers/etcd:3.5.0-0
# 特殊处理
docker rmi coredns/coredns:1.8.4
上面输出这些命令都要执行一下。
d 最终确认本地的镜像是否完整
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-apiserver v1.22.1 f30469a2491a 3 weeks ago 128MB
k8s.gcr.io/kube-proxy v1.22.1 36c4ebbc9d97 3 weeks ago 104MB
k8s.gcr.io/kube-controller-manager v1.22.1 6e002eb89a88 3 weeks ago 122MB
k8s.gcr.io/kube-scheduler v1.22.1 aca5ededae9c 3 weeks ago 52.7MB
k8s.gcr.io/etcd 3.5.0-0 004811815584 3 months ago 295MB
k8s.gcr.io/coredns/coredns v1.8.4 8d147537fb7d 3 months ago 47.6MB
k8s.gcr.io/pause 3.5 ed210e3e4a5b 6 months ago 683kB
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-apiserver v1.22.1 f30469a2491a 3 weeks ago 128MB
k8s.gcr.io/kube-proxy v1.22.1 36c4ebbc9d97 3 weeks ago 104MB
k8s.gcr.io/kube-controller-manager v1.22.1 6e002eb89a88 3 weeks ago 122MB
k8s.gcr.io/kube-scheduler v1.22.1 aca5ededae9c 3 weeks ago 52.7MB
k8s.gcr.io/etcd 3.5.0-0 004811815584 3 months ago 295MB
k8s.gcr.io/coredns/coredns v1.8.4 8d147537fb7d 3 months ago 47.6MB
k8s.gcr.io/pause 3.5 ed210e3e4a5b 6 months ago 683kB
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-apiserver v1.22.1 f30469a2491a 3 weeks ago 128MB
k8s.gcr.io/kube-proxy v1.22.1 36c4ebbc9d97 3 weeks ago 104MB
k8s.gcr.io/kube-controller-manager v1.22.1 6e002eb89a88 3 weeks ago 122MB
k8s.gcr.io/kube-scheduler v1.22.1 aca5ededae9c 3 weeks ago 52.7MB
k8s.gcr.io/etcd 3.5.0-0 004811815584 3 months ago 295MB
k8s.gcr.io/coredns/coredns v1.8.4 8d147537fb7d 3 months ago 47.6MB
k8s.gcr.io/pause 3.5 ed210e3e4a5b 6 months ago 683kB
6 初始化集群
关闭镜像 fstab最好也改一下
swapoff -a
初始化,俩IP一个是本地内网IP,一个是你希望POD用哪些IP段
sudo kubeadm init --kubernetes-version v1.22.1 --apiserver-advertise-address=192.168.6.91 --pod-network-cidr=10.6.0.0/16
sudo kubeadm init --kubernetes-version v1.22.1 --apiserver-advertise-address=192.168.6.91 --pod-network-cidr=10.6.0.0/16
sudo kubeadm init --kubernetes-version v1.22.1 --apiserver-advertise-address=192.168.6.91 --pod-network-cidr=10.6.0.0/16
执行完毕后,会有一个提示,记下来备用
kubeadm join 10.3.96.3:6443 --token w1zh7w.l6chof87e113m8u7 --discovery-token-ca-cert-hash sha256:5c010cce4123abcf6c48fd98f8559b33c1efc80742270d7493035a92adf53602
kubeadm join 10.3.96.3:6443 --token w1zh7w.l6chof87e113m8u7 --discovery-token-ca-cert-hash sha256:5c010cce4123abcf6c48fd98f8559b33c1efc80742270d7493035a92adf53602
kubeadm join 10.3.96.3:6443 --token w1zh7w.l6chof87e113m8u7 --discovery-token-ca-cert-hash sha256:5c010cce4123abcf6c48fd98f8559b33c1efc80742270d7493035a92adf53602
初始化本地配置
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装Weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
或者安装Calico
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f ./calico.yaml
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f ./calico.yaml
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f ./calico.yaml
或者安装flanel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f ./kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改cidr匹配后
kubectl apply -f ./kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改cidr匹配后
kubectl apply -f ./kube-flannel.yml
至此Master就配置完毕了
7 其他节点加入
另外搞至少2台机器
配置Docker、先安装gcr的POD
然后执行上面记下来的join命令
检查下
NAME STATUS ROLES AGE VERSION
k8s1 Ready master 2m v1.14.3
k8s2 Ready <none> 40s v1.14.3
k8s3 Ready <none> 28s v1.14.3
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s1 Ready master 2m v1.14.3
k8s2 Ready <none> 40s v1.14.3
k8s3 Ready <none> 28s v1.14.3
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s1 Ready master 2m v1.14.3
k8s2 Ready <none> 40s v1.14.3
k8s3 Ready <none> 28s v1.14.3
配置完毕!
8 测试
kubectl run nginx --image=nginx
kubectl run nginx --image=nginx
kubectl run nginx --image=nginx
在某一台主机测试
kubectl describe pod nginx | grep ip
kubectl describe pod nginx | grep ip
10.6.0.194
curl "10.6.0.194"
kubectl describe pod nginx | grep ip
10.6.0.194
curl "10.6.0.194"
附录:
如何重置
sudo kubeadm reset