集群环境 (1.18.10/1.22.16)
内网地址
类型
操作系统
服务器配置
10.0.0.7
Master
CentOS 7.6
2C8G
10.0.0.5
Node
CentOS 7.6
2C8G
10.0.0.6
Node
CentOS 7.6
2C8G
初始化配置
关闭防火墙,禁用iptables,关闭selinux ,禁用swap分区(云服务器默认)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 systemctl stop firewalld systemctl disable firewalld systemctl stop iptables systemctl disable iptables sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 swapoff -a sed -ri 's/.swap./#&/' /etc/fstab free -m
(修改主机名)配置部署节点的/etc/hosts
, 添加节点的ip和主机名解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 hostnamectl set-hostname k8s-master-01 hostnamectl set-hostname k8s-node-01 hostnamectl set-hostname k8s-node-02echo '' ' 10.0.0.7 k8s-master-01 10.0.0.5 k8s-node-01 10.0.0.6 k8s-node-02 ' '' >> /etc/hostscat /etc/hosts
在 Kubernetes 集群中,每个 Pod 都会被分配一个 IP 地址,Pod 内的容器也会被分配一个虚拟网卡和 IP 地址。当两个 Pod 之间需要通信时,它们使用这些 IP 地址进行通信。 然而,当 Pod 内的容器尝试与另一个 Pod 进行通信时,它们不会使用其 IP 地址直接发送数据包,而是会使用桥接的方式进行通信。这意味着数据包将通过 Linux 内核中的桥接设备进行传输,而不是通过网络接口发送。
为了确保这些桥接的数据包能够被正确地路由和转发,需要将它们传递到 iptables 的链中进行处理。Iptables 可以用于定义网络规则,使数据包能够正确路由到目的地。通过将桥接的 IPv4 流量传递到 iptables 的链中,可以确保 Kubernetes 集群中的 Pod 能够正确地通信,并且可以实现一些高级的网络功能,如网络策略和负载均衡等。
1 2 3 4 5 6 7 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF sysctl -p
1 2 3 modprobe br_netfilter lsmod | grep br_netfilter
在K8S中service有两种代理模型,一种基于iptables,一种基于ipvs。ipvs性能明显高一些
1 2 3 4 5 6 7 8 9 10 11 12 13 14 yum install ipset ipvsadmin yum install ipvsadmcat <<EOF > /etc/sysconfig/modules/ipvs.modules #!bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF
1 2 3 4 5 6 chmod +x /etc/sysconfig/modules/ipvs.modules bash /etc/sysconfig/modules/ipvs.modules lsmod | grep -e ip_vs -e nf_conntrack_ipv4
安装docker
1 2 3 4 5 6 yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.ustc.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo yum makecache
1 2 3 4 yum install docker-ce yum list docker-ce --showduplicates yum install --setopt =obsoletes=0 docker-ce-20.10.24-3.el7
1 2 3 4 5 6 7 cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://docker.1panel.live"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF
1 2 3 systemctl daemon-reload systemctl start docker systemctl enable docker
安装kubernetes组件
1 2 3 4 5 6 7 8 9 10 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
1 2 3 4 5 6 7 8 9 cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.ustc.edu.cn/kubernetes/core:/stable:/v1.28/rpm/ enabled=1 gpgcheck=1 gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key EOF
安装kubeadm,kubelet,kubectl
1 yum install --setopt =obsoletes=0 kubeadm-1.22.16-0 kubelet-1.22.16-0 kubectl-1.22.16-0
1 2 3 4 5 cat <<EOF > /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs" EOF
1 2 systemctl enable kubelet
准备集群镜像(好像只需在master节点上执行即可)
1 kubeadm config images list
为保证后期初始化稳定,先从阿里云镜像仓库中下载镜像然后重新命名镜像名称
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 echo '' ' #!/bin/bash images=( kube-apiserver:v1.22.17 kube-controller-manager:v1.22.17 kube-scheduler:v1.22.17 kube-proxy:v1.22.17 pause:3.5 etcd:3.5.0-0 coredns:1.8.4 ) for imageName in ${images[@]} ; do docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done ' '' > k8simages.shchmod +x k8simages.sh ./k8simages.sh
集群初始化 (只需在master节点上执行即可)
1 2 3 4 5 6 kubeadm init \ --kubernetes-version v1.22.16 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --image-repository registry.aliyuncs.com/google_containers \ --apiserver-advertise-address=10.0.0.7
1 2 3 mkdir -p $HOME /.kubesudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/configsudo chown $(id -u):$(id -g) $HOME /.kube/config
1 2 kubeadm join 10.0.0.7:6443 --token usyjf2.zk2p9syzru0gp1qp \ --discovery-token-ca-cert-hash sha256:934b5355c8ec53039fd40cc10b01ba7efe3b66b4036a27a49d12d38d8a93ba56
安装网络插件flannel
下载kube-flannel.yml(master节点)
1 wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
1 2 docker pull docker.io/flannel/flannel:v0.25.4 docker pull docker.io/flannel/flannel-cni-plugin:v1.4.1-flannel1
1 kubectl apply -f kube-flannel.yml
如果长时间为 NotReady 状态,需要修改/var/lib/kubelet/kubeadm-flags. Env,删除 –network-plugin=cni Vim /var/lib/kubelet/kubeadm-flags. Env 重新启动 Systemctl daemon-reload Ystemctl restart kubelet
kubernetes部署nginx(node节点要能联网拉取镜像)
1 2 3 4 kubectl create deployment nginx --image=nginx:1.14-alpine kubectl expose deployment nginx --port=80 --type =NodePort
1 kubectl get pods,service
1 kubectl describe pod nginx-65c4bffcb6-6pgj2