k8s公网部署

翻新之前的文章
写的很乱的,多种安装方式

本次实验使用三台机器在不同地区进行部署,实验环境使用到香港服务器和杭州阿里云服务器,公网环境部署网络稳定性不能得到保证,本文部署方式仅供参考。

环境准备

环境

软件软件版本
Docker20.0.1
Kubernetes1.23.6

服务器规划

服务器主机名服务器公网IP
master149.104.23.134
node1121.41.53.83
node2116.62.32.149

解析hosts

cat >> /etc/hosts << EOF
149.104.23.134 master
121.41.53.83 node1
116.62.32.149 node2
EOF

执行初始化脚本

bash <(curl -sSl https://git.7boe.top/root/Shell/-/raw/af8fc85f5d15181942fc791305dc64e94c32c36e/k8s.sh?inline=false)

Docker安装

安装软件导入docker官方源

yum install -y yum-utils 
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

使用docker20版本

sudo yum install docker-ce-20.10.14-3.el7 docker-ce-cli-20.10.14-3.el7 containerd.io docker-compose-plugin

其他版本有部分差异,可能会出奇怪问题。
换docker镜像源

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

设置开机自启

systemctl daemon-reload && systemctl restart docker && systemctl enable docker && systemctl status docker 

这里没有安装cri,因为k8s1.23版本还在提供docker作为容器运行

确认这里一定是systemd

因为k8s是默认systemd作为cgroup driver,如果Docker使用另外的驱动,则可能出现不稳定的情况。

docker info | grep "Cgroup Driver"

安装k8s

k8s导入源使用阿里云的源

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

sudo yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 --disableexcludes=kubernetes

开机自启

systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet

拉取镜像

kubeadm config images pull --kubernetes-version=v1.23.6 --image-repository registry.aliyuncs.com/google_containers

也可以使用配置文件拉取

vim kubeadm-config-image.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
imageRepository: registry.aliyuncs.com/google_containers 

拉取

kubeadm config images pull --config kubeadm-config-image.yaml

初始化

之前这里是最头疼的地方,如果是一个内网里面直接就好了,但是公网的话直接写公网ip他就一直报错,提示找不到这个ip,应为阿里云服务器网卡没有绑定公网ip,eth0写的是内网vpc专业网络内网ip,采用的自动对外映射公网方式。

这样初始化要变通一下
先生成一个配置文件

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

更改配置文件

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 #这样改成master的公网ip
  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: {}

检查环境是否支持

kubeadm init phase preflight --config=kubeadm-config.yaml 
kubeadm init --config=kubeadm-config.yaml

这里基本是初始化必失败的
到这里,会有2种结果:
如果是内网,上面的docker版本,kubeadm版本没错的话,会成功.
如果在云服务器(腾讯云,阿里云)上,一定会失败(原因和办法在这里):

云服务器初始化失败

[kubelet-check] Initial timeout of 40s passed.

卡在这里应为他找不到你设定的apiserver IP地址
但是你必须要初始化,目的是为了生成k8s的配置文件,否则下面的步骤中你会找不到etcd.yaml),失败后再执行下面的步骤!!

vim /etc/kubernetes/manifests/etcd.yaml

更改以下配置,来源文章

    - --listen-client-urls=https://127.0.0.1:2379,https://101.34.112.190:2379
    - --listen-peer-urls=https://101.34.112.190:2380

改成

    - --listen-client-urls=https://127.0.0.1:2379
    - --listen-peer-urls=https://127.0.0.1:2380

因为上方的地址他监听不到,要改成本地

systemctl stop kubelet 
netstat -anp |grep kube

请注意,不要执行 kubeadm reset,先 systemctl stop kubelet ,然后手动通过 netstat -anp |grep kube 来找pid,再通过 kill -9 pid 强杀。否则又会生成错误的etcd配置文件,这里非常关键!!!

重新初始化,但是跳过etcd文件已经存在的检查:

# 重新启动kubelet
systemctl start kubelet
重新初始化,跳过配置文件生成环节,不要etcd的修改要被覆盖掉
kubeadm init --config=kubeadm-config.yaml --skip-phases=preflight,certs,kubeconfig,kubelet-start,control-plane,etcd

成功初始化

如果所有配置都正常,很快会输出下面的信息(秒级别)代表了成功,否则大概率是失败(由于网络超时等):

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 命令

后面命令要是没了用这个,生成一个新的

kubeadm token create --print-join-command

token忘记

kubeadm token list

每一个节点都执行的话都可以操作kubectl,文件要scp过去

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装网络插件

calico

查看官网文档,看对应版本

https://docs.tigera.io/calico/3.25/getting-started/kubernetes/self-managed-onprem/onpremises

3.25目前支持1.23的k8s

https://docs.tigera.io/calico/3.25/getting-started/kubernetes/requirements

安装

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml 

flannel

如果您使用自定义podCIDR(不是10.244.0.0/16),您首先需要下载上述清单并修改网络以匹配您的网络。

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

允许master节点部署pod

调度策略

  • NoSchedule: 一定不能被调度
  • PreferNoSchedule: 尽量不要调度
  • NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod

查看当前调度策略

kubectl describe node|grep -E "Name:|Taints:"

更改master节点可被部署pod

kubectl taint nodes --all node-role.kubernetes.io/master:NoSchedule-