使用kubeadm快速部署一个kubernetes集群
Kubeadm 是一个创建和管理 Kubernetes 集群的工具。
1、安装需求
- 一台或多台运行着下列系统的机器:
- Ubuntu 16.04+
- Debian 9+
- CentOS 7
- Red Hat Enterprise Linux (RHEL) 7
- Fedora 25+
- HypriotOS v1.0.1+
- Container Linux (测试 1800.6.0 版本)
- 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响您应用的运行内存)
- 2 核 CPU 或更多,硬盘30GB或更多。
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
- 禁用交换分区。
2、准备开始
我用 VMware 创建了三台 Centos7 虚拟机,每台虚拟机添加了两块网卡,一块网卡用于集群内部之间的通信,一块网卡用于连接到互联网下载软件和拉取镜像。内网 IP 规划如下:
角色 | IP |
k8s-master | 192.168.66.10 |
k8s-node01 | 192.168.66.20 |
k8s-node02 | 192.168.66.21 |
3、系统初始化
- 关闭防火墙
# systemctl stop firewalld && systemctl disable firewalld
- 关闭 swap
# swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- 关闭 selinux
# setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/
- 设置 hostname
# hostnamectl set-hostname k8s-master
- 添加 hosts
# cat >> /etc/hosts << EOF 192.168.66.10 k8s-master 192.168.66.20 k8s-node1 192.168.66.21 k8s-node2 EOF
- 调整内核参数
# cat > /etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 EOF # sysctl -p /etc/sysctl.d/kubernetes.conf
- 开启 ipvs
modprobe用来加载或移除内核模块 # modprobe br_netfilter # cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv
4、Docker/Kubeadm/Kubelet/Kubectl的部署安装
4.1、安装 Docker
添加阿里YUM源 # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # yum update -y && yum install -y docker-ce 配置镜像仓库 # cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF 重启docker systemctl daemon-reload && systemctl restart docker && systemctl enable docker
4.2、安装Kubeadm、Kubectl、Kubelet
添加阿里云yum软件源 # 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
# yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 # systemctl enable kubelet
5、主节点集群初始化
# kubeadm init \ --apiserver-advertise-address=192.168.66.10 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
-
--apiserver-advertise-address:主节点IP
-
--image-repository registry.aliyuncs.com/google_containers:默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
-
--service-cidr=10.96.0.0/12:service的clusterIP地址范围
-
--pod-network-cidr=10.244.0.0/16:pod的IP地址范围,后面我们会安装网络插件Calico,10.244.0.0/16为Calico默认地址,这里设置和Calico保持一致
初始化完成后,会有如下日志提示,安装提示执行命令
# mkdir -p $HOME/.kube # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # sudo chown $(id -u):$(id -g) $HOME/.kube/config
5.1、为 kube-proxy 开启 ipvs
# kubectl edit cm kube-proxy -n kube-system
把其中的 mode 改为 ipvs
...... kind: KubeProxyConfiguration metricsBindAddress: "" mode: "ipvs" nodePortAddresses: null oomScoreAdj: null portRange: "" ......
# kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
6、加入节点
在节点上执行,主节点 kubeadm init 后打印的 kubeadm join 命令
# kubeadm join 192.168.66.10:6443 --token esce21.q6hetwm8si29qxwn \ --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5
如果忘了 token 或者 token 过期不可用了,可执行如下命令重新生成
# kubeadm token create # kubeadm token list # openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924 # kubeadm join 192.168.66.10:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash sha256:63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924
7、安装 Calico 网络插件
先把资源清单下载下来
# wget https://docs.projectcalico.org/manifests/calico.yaml
修改如下配置
-
CALICO_IPV4POOL_CIDR:根据主节点初始化修改Pod CIDR
-
CALICO_IPV4POOL_IPIP:选择 IPIP 工作模式
...... - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16" ...... # Enable IPIP - name: CALICO_IPV4POOL_IPIP value: "Always"
8、测试集群
查看节点,Calico 安装成功后,master 的状态会变成 Ready
节点成功加入,节点状态是 Ready
# kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready master 3d20h v1.18.1 node01 NotReady <none> 3d20h v1.18.0 node02 NotReady <none> 3d14h v1.18.0
创建一个 deployment
# kubectl create deployment nginx --image=nginx # kubectl expose deployment nginx --port=80 # kubectl get pod,svc
查看服务是否能访问
curl Cluster-Ip