K8s集群部署
官方文档
kubeadm搭建集群环境配置
一台兼容的Linux主机;kubernetes项目是基于Debian和Red Hat的Linux发行版以及一些不提供包管理器的发行版提供通用的指令
每台机器2GB或者更多的 RAM(过小会影响应用的运行内存)
2 CPU核或者更多
集群中所有机器的网络彼此均能互相连接(公网和内网都可以)
节点之间不可以有重复的主机名,MAC地址和product_uuid
开启机器上的某些端口
禁用交换分区;为了保证kubelet正常工作,必须禁用交换分区
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 38 39 40 41 42 43 44 45 46 47 cat /etc/os-releaseuname -rfree -h / top / cat /proc/meminfo nproc / lscpu(详细版)ip link / ifconfig -a sudo cat /sys/class/dmi/id/product_uuid nc 127.0.0.1 6443 yum install nc -y hostname hostnamectl set-hostname [主机名] setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf br_netfilter EOF cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system
安装kubelet,kubeadm,kubectl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes sudo systemctl enable --now kubelet
下载各个机器需要的镜像 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 sudo tee ./images.sh <<-'EOF' images=( kube-apiserver:v1.20.9 kube-proxy:v1.20.9 kube-controller-manager:v1.20.9 kube-scheduler:v1.20.9 coredns:1.7.0 etcd:3.4.13-0 pause:3.2 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/igsshansz/$imageName done EOF chmod +x ./images.sh && ./images.shsudo tee ./delete_images.sh <<-'EOF' images=( kube-apiserver:v1.20.9 kube-proxy:v1.20.9 kube-controller-manager:v1.20.9 kube-scheduler:v1.20.9 coredns:1.7.0 etcd:3.4.13-0 pause:3.2 ) for imageName in ${images[@]} ; do docker rmi registry.cn-hangzhou.aliyuncs.com/igsshansz/$imageName done EOF chmod +x ./delete_images.sh && ./delete_images.sh
初始化主节点 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 38 39 40 41 42 43 44 45 46 47 48 echo "192.168.107.21 cluster-endpoint" >> /etc/hostskubeadm init \ --apiserver-advertise-address=192.168.107.21 \ --control-plane-endpoint=cluster-endpoint \ --image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \ --kubernetes-version v1.20.9 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=192.168.0.0/16 --service-cidr=10.96.0.0/16 --pod-network-cidr=192.168.0.0/16 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/ You can now join any number of control-plane nodes by copying certificate authorities and service account keys on each node and then running the following as root: kubeadm join cluster-endpoint:6443 --token 5n6e9p.qio5j0v2ywwggwxe \ --discovery-token-ca-cert-hash sha256:79ee6694635231298a274675e60f6ac96b2e48ed1bd667fc7d1cfecd799f8c88 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: kubeadm join cluster-endpoint:6443 --token 5n6e9p.qio5j0v2ywwggwxe \ --discovery-token-ca-cert-hash sha256:79ee6694635231298a274675e60f6ac96b2e48ed1bd667fc7d1cfecd799f8c88
要使用非 root 用户可以运行 kubectl ,请运行一下命令,它们也是kubeadm init输出的一部分
1 2 3 mkdir -p $HOME /.kubesudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config
如果你是root用户,则可以运行
1 export KUBECONFIG=/etc/kubernetes/admin.conf
警告:
kubeadm 对 admin.conf 中的证书进行签名时,将其配置为 Subject: O = system:masters, CN = kubernetes-admin。 system:masters 是一个例外的、超级用户组,可以绕过鉴权层(例如 RBAC)。 不要将 admin.conf 文件与任何人共享,应该使用 kubeadm kubeconfig user 命令为其他用户生成 kubeconfig 文件,完成对他们的定制授权。 更多细节请参见为其他用户生成 kubeconfig 文件 。
记录 kubeadm init 输出的 kubeadm join 命令。 你需要此命令将节点加入集群 。
如果需要重新生成新的令牌执行: kubeadm token create --print-join-command
安装 Pod 网络附加组件
你必须部署一个基于 Pod 网络插件的容器网络接口(CNI), 以便你的 Pod 可以相互通信。在安装网络之前,集群 DNS (CoreDNS) 将不会启动。
calico官网
1 2 3 4 5 curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O kubectl apply -f calico.yaml
每个集群只能安装一个 Pod 网络。
安装 Pod 网络后;可以通过在kubectl get pods --all-namespaces输出中检查 CoreDNS Pod 是否running来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。
加入节点
先决条件
必要时安装一个运行时
运行 kubeadm init 输出的命令,例如:
1 2 kubeadm join cluster-endpoint:6443 --token 5n6e9p.qio5j0v2ywwggwxe \ --discovery-token-ca-cert-hash sha256:79ee6694635231298a274675e60f6ac96b2e48ed1bd667fc7d1cfecd799f8c88
默认情况下,令牌会是在24小时后过期
如果过期了,需要重新生成令牌
集群搭建遇到的问题