kubernetes 是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes 有多种安装方式,比如麻烦无比的二进制安装方式,本篇文章主要讲解如何使用 Kubeadm 来安装 Kubernetes 集群。
前期准备工作
系统 |
角色 |
IP |
主机名 |
内存(2G以上) |
Centos 7 |
master |
192.168.60.11 |
k8s-master-11.cn |
2G |
Centos 7 |
node |
192.168.60.16 |
k8s-node-16.cn |
2G |
Centos 7 |
node |
192.168.60.170 |
k8s-node-170.cn |
2G |
本文搭建的只是 Kubernetes 集群,而不是 Kubernetes 高可用集群,高可用集群需要多台 master 节点来避免 master 节点中某台服务可能宕机。下面这些前期准备,需要在所以服务器上执行一遍。由于本文使用的操作系统是 Centos,其中你是 Ubuntu 用户,请查看官方具体的操作。
根据表格中的信息修改服务器主机名的,具体的主机名请根据自己实际命名修改。需要注意的是,必须保证每台服务器的主机名唯一。
1 2 3 4 5
| hostnamectl set-hostname k8s-master-11.cn
hostname
|
向每台服务器上的 /etc/hosts
文件添加一下配置。因为只有三台服务器,我们直接修改 hosts 文件来指定,如果是很大的集群,每次添加一个节点,都要修改每台服务器的 hosts 文件,这样会很麻烦,所以可以选择使用dns去解析,但是我们这里只有几台服务器,就直接修改 hosts 文件即可。
1 2 3
| 192.168.60. k8s-master-252.cn 192.168.60.227 k8s-node-227.cn 192.168.60.15 k8s-node-15.cn
|
关闭防火墙
1 2 3 4 5 6
| systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --state
|
关闭服务器的 swap 交换空间
1 2 3 4
| swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
free -m
|
安装 Docker, Kubernetes 官网的安装 Docker 教程。
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
| yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
yum install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
yum update && yum install \ containerd.io-1.2.10 \ docker-ce-19.03.4 \ docker-ce-cli-19.03.4
mkdir /etc/docker
vi /etc/docker/daemon.json { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"], "exec-opts": ["native.cgroupdriver=systemd"] }
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload systemctl restart docker
|
注意: 修改配置文件后,记得重启 Docker。
关闭 SElinux
1 2 3 4 5
| sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
getenforce
|
同步服务器时间,并把时区设置为上海时区,如果是 Ubuntu 用户,请自行百度查询如何设置更新服务器时间。
1 2 3 4 5 6 7
| yum install -y ntpdate
timedatectl set-timezone Asia/Shanghai
date
|
Centos7 用户还需要设置路由
1 2
| yum install -y bridge-utils.x86_64 modprobe br_netfilter
|
将桥接的IPV4流量传递到iptables 的链
1 2 3 4 5 6 7 8
| vi /etc/sysctl.d/kubernetes.conf
# 粘贴内容 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1
# 刷新 sudo sysctl --system
|
设置 kubeadm 下载地址
1 2 3 4 5 6 7 8 9 10 11
| vi /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
|
下载 kubelet kubeadm kubectl
1 2 3 4
| yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable --now kubelet
|
到此,每台服务器上的准备工作基本准备完成了。下面一节,将会讲解如何使用 kubeadm 初始化 kubernetes 集群。
Kubeadm 初始化 Kubernetes 集群
注意:在我们选定的 Master 节点的服务器上操作以下命令。
这里我使用的是配置文件初始化集群,如果你想直接使用命令,请查看官网的具体参数文档,kubeadm init 参数官网地址
1 2
| kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
|
查看 kubeadm.yml 文件,并修改下面几个有备注的地方。其中主要修改的是主节点IP;镜像地址,这里我们使用的是阿里云镜像仓库;以及Pod 所在网段,如果你服务器所在的集群网段不和 192.168.0.0/16
冲突,可以不修改这个网段地址,使用默认即可。注意:如果修改了网段地址,需要在网络插件 calico 中修改 CALICO_IPV4POOL_CIDR
的默认值,改为你修改后的网段值。这里我就碰到一个坑,我的服务器网段是在 192.169.0.0 网段的,一开始,没修改默认时,安装 calico 时,一直出问题。后来查看 calico 官网文档,发现需要修改 kubernetes 默认网段,但是忘记修改 calico 中的默认值,然后又出现 Pod 中无法 PING 通集群服务器的IP 的问题。
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
| apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.60.11 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master-1 taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.17.0 networking: podSubnet: 10.244.0.0/16 dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 scheduler: {}
|
1 2 3 4 5 6 7 8 9 10 11 12
| kubeadm config images list --config kubeadm.yml
kubeadm config images pull --config kubeadm.yml
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.60.237 --upload-certs
|
执行成功后,会出现上面图中的信息,你需要在 master 节点执行第一个圈出的命令,这样你可以在master节点上使用 kubectl 命令;第二个圈出的命令,需要你在node节点上执行操作,将 node 节点加入 master 节点。
将node节点加入master节点后,使用kubectl get nodes 查看节点,你会发现这里有三台服务器,如下图所示,但是这时候,status状态不是下面显示的 Ready,而是 NotReady (PS:因为我这个截图是按照好后的截图),这表示集群之间网络时不互通的,需要安装网络插件,安装好网络插件后就会出现下面的信息了。
注意: Kubernetes 所以执行操作都是在master节点操作的,node节点主要是启动各种 Pod 的。
安装网络插件 Calico
Calico 官方地址
1 2 3 4 5
| kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
watch kubectl get pods --all-namespaces
|
注意: 如果默认的宿主机的默认网段是192.168.0.0/16,则需要修改该网段,详情请看kubeadm master节点初始化步骤。如果修改了Kubernetes Pod 的网段地址,需要在 calico.yaml 中修改 CALICO_IPV4POOL_CIDR
对应的值,这个值的默认值为 192.168.0.0/16
,然后修改为kubeadm 中修改后的值。如下图所示:
新增 node 节点
如果需要新增新的node节点,你需要执行上面的前期准备工作,然后使用下面的命令,获取 token 和 SHA256,然后在新的节点上,执行 kubeadm join 命令,将新节点加入集群,具体命令请看下面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| kubeadm token list
kubeadm token create
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
kubeadm join 192.168.60.252:6443 --token bq9xsp.bpf3zfl7mndpl9h2 \ --discovery-token-ca-cert-hash sha256:937e143e3bd79a24f1cdefd2693072484757beeb06869af07ba4962a78b4544d
kubectl get nodes
kubeadm token create --print-join-command
|