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 2 3 4 5 cat >> /etc/hosts << EOF 149.104.23.134 master 121.41.53.83 node1 116.62.32.149 node2 EOF
执行初始化脚本
1 bash <(curl -sSl https://git.7boe.top/root/Shell/-/raw/af8fc85f5d15181942fc791305dc64e94c32c36e/k8s.sh?inline=false )
Docker安装 安装软件导入docker官方源
1 2 yum install -y yum-utils yum-config-manager --add -repo http:
使用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 2 3 4 5 6 7 8 9 10 cat <<EOF > /etc/ docker/daemon.json { "registry-mirrors" : [ "http://hub-mirror.c.163.com" , "https://docker.mirrors.ustc.edu.cn" , "https://registry.docker-cn.com" ], "exec-opts" : ["native.cgroupdriver=systemd" ] }EOF
设置开机自启
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 2 3 4 5 6 7 8 9 cat > /etc/yum.repos.d/kubernetes.repo << EOF [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 EOF
安装k8s
1 sudo yum install -y kubelet-1.23 .6 kubeadm-1.23 .6 kubectl-1.23 .6
开机自启
1 systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
拉取镜像
1 kubeadm config images pull
也可以使用配置文件拉取
1 vim kubeadm-config -image.yaml
1 2 3 apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration imageRepository: registry.aliyuncs.com/google_containers
拉取
1 kubeadm config images pull
初始化
之前这里是最头疼的地方,如果是一个内网里面直接就好了,但是公网的话直接写公网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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 149.104 .23 .134 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock imagePullPolicy: IfNotPresent name: master taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {}dns: {}etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: 1.23 .6 networking: dnsDomain: cluster.local serviceSubnet: 10.96 .0 .0 /12 podSubnet: 192.168 .0 .0 /16 scheduler: {}
检查环境是否支持
1 2 kubeadm init phase preflight --config=kubeadm-config.yaml kubeadm init --config=kubeadm-config.yaml
这里基本是初始化必失败的 到这里,会有2种结果: 如果是内网,上面的docker版本,kubeadm版本没错的话,会成功. 如果在云服务器(腾讯云,阿里云)上,一定会失败(原因和办法在这里):
云服务器初始化失败 1 [kubelet- check ] Initial timeout of 40 s passed.
卡在这里应为他找不到你设定的apiserver IP地址 但是你必须要初始化,目的是为了生成k8s的配置文件,否则下面的步骤中你会找不到etcd.yaml),失败后再执行下面的步骤!!
1 vim /etc/kubernetes/manifests/etcd.yaml
更改以下配置,来源文章 。
1 2 - --listen -client-urls=https:// 127.0 .0 .1 :2379 ,https:// 101.34 .112 .190 :2379 - --listen -peer-urls=https:// 101.34 .112 .190 :2380
改成
1 2 - --listen -client-urls=https:// 127.0 .0 .1 :2379 - --listen -peer-urls=https:// 127.0 .0 .1 :2380
因为上方的地址他监听不到,要改成本地
1 2 systemctl stop kubelet netstat -anp |grep kube
请注意,不要执行 kubeadm reset,先 systemctl stop kubelet ,然后手动通过 netstat -anp |grep kube 来找pid,再通过 kill -9 pid 强杀。否则又会生成错误的etcd配置文件,这里非常关键!!!
重新初始化,但是跳过etcd文件已经存在的检查:
1 2 3 4 # 重新启动kubelet systemctl start kubelet 重新初始化,跳过配置文件生成环节,不要etcd的修改要被覆盖掉 kubeadm init --config=kubeadm-config.yaml --skip-phases=preflight,certs,kubeconfig,kubelet-start,control-plane,etcd
成功初始化 如果所有配置都正常,很快会输出下面的信息(秒级别)代表了成功,否则大概率是失败(由于网络超时等):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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: 加入k8s 命令
后面命令要是没了用这个,生成一个新的
token忘记
每一个节点都执行的话都可以操作kubectl,文件要scp过去
1 2 3 mkdir -p $HOME /.kubesudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/configsudo chown $(id -u):$(id -g) $HOME /.kube/config
安装网络插件 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 2 如果您使用自定义podCIDR(不是10.244 .0.0 /16 ),您首先需要下载上述清单并修改网络以匹配您的网络。 kubectl apply -f https://gi thub.com/flannel-io/ flannel/releases/ latest/download/ kube-flannel.yml
允许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-