K8s 公网部署(错误修改)
k8s公网部署
翻新之前的文章
写的很乱的,多种安装方式
本次实验使用三台机器在不同地区进行部署,实验环境使用到香港服务器和杭州阿里云服务器,公网环境部署网络稳定性不能得到保证,本文部署方式仅供参考。
环境准备
环境
| 软件 | 软件版本 |
|---|---|
| Docker | 20.0.1 |
| Kubernetes | 1.23.6 |
服务器规划
| 服务器主机名 | 服务器公网IP |
|---|---|
| master | 149.104.23.134 |
| node1 | 121.41.53.83 |
| node2 | 116.62.32.149 |
解析hosts
1 | cat >> /etc/hosts << EOF |
执行初始化脚本
1 | bash <(curl -sSl https://git.7boe.top/root/Shell/-/raw/af8fc85f5d15181942fc791305dc64e94c32c36e/k8s.sh?inline=false) |
Docker安装
安装软件导入docker官方源
1 | yum install -y yum-utils |
使用docker20版本
1 | sudo yum install docker-ce-20.10.14-3.el7 docker-ce-cli-20.10.14-3.el7 containerd.io docker-compose-plugin |
其他版本有部分差异,可能会出奇怪问题。
换docker镜像源
1 | cat <<EOF > /etc/docker/daemon.json |
设置开机自启
1 | systemctl daemon-reload && systemctl restart docker && systemctl enable docker && systemctl status docker |
这里没有安装cri,因为k8s1.23版本还在提供docker作为容器运行
确认这里一定是systemd
因为k8s是默认systemd作为cgroup driver,如果Docker使用另外的驱动,则可能出现不稳定的情况。
1 | docker info | grep "Cgroup Driver" |
安装k8s
k8s导入源使用阿里云的源
1 | cat > /etc/yum.repos.d/kubernetes.repo << EOF |
安装k8s
1 | sudo yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 --disableexcludes=kubernetes |
开机自启
1 | systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet |
拉取镜像
1 | kubeadm config images pull --kubernetes-version=v1.23.6 --image-repository registry.aliyuncs.com/google_containers |
也可以使用配置文件拉取
1 | vim kubeadm-config-image.yaml |
1 | apiVersion: kubeadm.k8s.io/v1beta2 |
拉取
1 | kubeadm config images pull --config kubeadm-config-image.yaml |
初始化
之前这里是最头疼的地方,如果是一个内网里面直接就好了,但是公网的话直接写公网ip他就一直报错,提示找不到这个ip,应为阿里云服务器网卡没有绑定公网ip,eth0写的是内网vpc专业网络内网ip,采用的自动对外映射公网方式。
这样初始化要变通一下
先生成一个配置文件
1 | kubeadm config print init-defaults > kubeadm-config.yaml |
- pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。通常,Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
- api-server:使用Master作为api-server,所以就是master机器的IP地址。
- image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io。
- nodeRegistration.name:改成master
更改配置文件
1 | apiVersion: kubeadm.k8s.io/v1beta3 |
检查环境是否支持
1 | kubeadm init phase preflight --config=kubeadm-config.yaml |
这里基本是初始化必失败的
到这里,会有2种结果:
如果是内网,上面的docker版本,kubeadm版本没错的话,会成功.
如果在云服务器(腾讯云,阿里云)上,一定会失败(原因和办法在这里):
云服务器初始化失败
1 | [kubelet-check] Initial timeout of 40s passed. |
卡在这里应为他找不到你设定的apiserver IP地址
但是你必须要初始化,目的是为了生成k8s的配置文件,否则下面的步骤中你会找不到etcd.yaml),失败后再执行下面的步骤!!
1 | vim /etc/kubernetes/manifests/etcd.yaml |
更改以下配置,来源文章。
1 | - --listen-client-urls=https://127.0.0.1:2379,https://101.34.112.190:2379 |
改成
1 | - --listen-client-urls=https://127.0.0.1:2379 |
因为上方的地址他监听不到,要改成本地
1 | systemctl stop kubelet |
请注意,不要执行 kubeadm reset,先 systemctl stop kubelet ,然后手动通过 netstat -anp |grep kube 来找pid,再通过 kill -9 pid 强杀。否则又会生成错误的etcd配置文件,这里非常关键!!!
重新初始化,但是跳过etcd文件已经存在的检查:
1 |
|
成功初始化
如果所有配置都正常,很快会输出下面的信息(秒级别)代表了成功,否则大概率是失败(由于网络超时等):
1 | Your Kubernetes control-plane has initialized successfully! |
后面命令要是没了用这个,生成一个新的
1 | kubeadm token create --print-join-command |
token忘记
1 | kubeadm token list |
每一个节点都执行的话都可以操作kubectl,文件要scp过去
1 | mkdir -p $HOME/.kube |
安装网络插件
calico
查看官网文档,看对应版本
1 | https://docs.tigera.io/calico/3.25/getting-started/kubernetes/self-managed-onprem/onpremises |
3.25目前支持1.23的k8s
1 | https://docs.tigera.io/calico/3.25/getting-started/kubernetes/requirements |
安装
1 | kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml |
flannel
1 | 如果您使用自定义podCIDR(不是10.244.0.0/16),您首先需要下载上述清单并修改网络以匹配您的网络。 |
允许master节点部署pod
调度策略
- NoSchedule: 一定不能被调度
- PreferNoSchedule: 尽量不要调度
- NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod
查看当前调度策略
1 | kubectl describe node|grep -E "Name:|Taints:" |
更改master节点可被部署pod
1 | kubectl taint nodes --all node-role.kubernetes.io/master- |









