首先要做安装前的准备:
1、最少三台节点,CentOS 7系统,每台不低于4核4G资源,并配置host域名
[root@hdp1 ~] cat /etc/hosts
192.168.88.186 hdp1
192.168.88.187 hdp2
192.168.88.188 hdp3
2、所有节点保证时间同步、并做SSH互信
SSH互信:https://blog.csdn.net/dudadudadd/article/details/117816179
取消SSH检查:https://blog.csdn.net/dudadudadd/article/details/117899463
时间服务:https://blog.csdn.net/dudadudadd/article/details/110947177
3、所有节点关闭防火墙、setenfore、SELINUX、交换分区
关闭防火墙:
systemctl stop firewalld.service
systemctl disable firewalld.service
关闭setenfore和SELINUX:
setenforce 0 && sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config && getenforce
关闭交换分区:
vi /etc/fstab
注释swap的行
#/dev/mapper/cs-swap none swap defaults 0 0
# 查看是否关闭
free -h
4、在git上选择你要安装的版本https://github.com/kubernetes/kubernetes/releases
在git上只是看一下版本,安装的时候用阿里的镜像yum安装,但是你要知道如果有一天别人和你说起除了yum安装rpm包这种方式之外的tar包安装,你要知道,这种方法需要从git上下载安装包,并且不是直接点击Assets下面的连接,而是点击CHANGELOG
,去下载分包
现在开始正式的安装。
1、三台节点下载docker,由于k8s的1.20.15以后不在支持docker,所有docker的版本也不宜过高,防止出现k8s和docker之间的版本问题,这里安装18.06.3,安装方法
https://blog.csdn.net/dudadudadd/article/details/128176347
和k8s一起使用需要添加一个配置,编辑文件/etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]
改完后重启docker
systemctl daemon-reload
systemctl restart docker
2、准备k8s的国内镜像yum,在任意一台机器上,新建/etc/yum.repos.d/kubernetes.repo
文件
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1
刷新yum源
yum repolist
由于另外两台节点也有使用所以先推送过去
scp kubernetes.repo hdp2:/etc/yum.repos.d/
scp kubernetes.repo hdp3:/etc/yum.repos.d/
3、选择出一台机器做主节点,安装服务,这里用hdp1做主节点
安装k8s的安装工具kubeadm、客户端kubectl、节点服务kubelet,注意只能安装1.20.15一下的版本,原因我已经在docker的介绍中说过了。这里安装1.17.0
yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
安装完成后,你要确保下面的系统文件的值都是1
/proc/sys/net/bridge/bridge-nf-call-ip6tables
/proc/sys/net/bridge/bridge-nf-call-iptables
如果不是1,运行下面的命令
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
修改/etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
设置kubelet和docker服务系统开机自启
systemctl enable kubelet docker
初始化master节点
kubeadm init --kubernetes-version=v1.17.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --image-repository registry.aliyuncs.com/google_containers
init的参数都可以通过–help查帮助
--kubernetes-version
指定安装版本,如果不指定默认"stable-1"
--pod-network-cidr
设置pod网络的ip地址范围,这个返回一般不变,就和docker内部容器的ip一样
--service-cidr
Service的ip和pod网络一样一般不变
--ignore-preflight-errors
是忽略某些警告
--image-repository
设置镜像下载的远程仓库,一定要设置成阿里云
--apiserver-advertise-address
设置API Server的通信地址不过一般默认就行,还可以改端口号,不过一般也默认
最后会输出如下的信息,表示初始化成功
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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
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:
kubeadm join 192.168.88.186:6443 --token iwhiht.j7d3xzmc5zlrr4o4 \
--discovery-token-ca-cert-hash sha256:4ff043695bb82b72a8982f76c92588726c88fd2fddbbd31e53e5dcfff144fd30
此时按照输出的日志已经告诉了你下一步该做什么,To start using your cluster, you need to run the following as a regular user
,就是用一个普通的用户执行三条命令,在项目上使用的话就需要严格执行,但是个人自己的虚拟机上使用直接用root用户就行,而且只用运行前两条就行,不然还要去配置新用户添加sudo权限,比较麻烦。总之上面三条命令的最终目的就是让一个日后负责k8s的运维人员有可执行的k8s命令,而一般不可能拿不到root密码,所以用一个普通的用户。
[root@hdp1 ~] mkdir -p $HOME/.kube
[root@hdp1 ~] cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
最后一段相当重要!!!!!!Then you can join any number of worker nodes by running the following on each as root
的信息你一定要保留,它是在告诉你,其他的k8s节点可以在root用户下使用kubeadm join 192.168.88.186:6443 --token iwhiht.j7d3xzmc5zlrr4o4 --discovery-token-ca-cert-hash sha256:4ff043695bb82b72a8982f76c92588726c88fd2fddbbd31e53e5dcfff144fd30
命令加入master所在的k8s集群,这条命令一定要保存下来!!!!!!后面如果丢失想要再找回来巨麻烦!!!!!
当你运行完日志中的命令,在master节点上你就可以运行k8s的命令了,比如运行get获取组件状态信息
[root@hdp1 ~] kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
你重点要看一下当前集群的节点
[root@hdp1 ~] kubectl get nodes
NAME STATUS ROLES AGE VERSION
hdp1 NotReady master 41m v1.17.0
你会发现hdp1这个master节点未准备就绪,这是因为它缺一个重要的网络组件,之所以缺失是因为该组件k8s官方一直用的是第三方组件,本身不自带,一般是Flannel。所以我们要去git上找Flannel并安装。https://github.com/flannel-io/flannel
,去找Deploying flannel manually
,会告诉你如何安装
图片中已经告诉你,如果你是1.17+的版本,你可以直接运行命令下载相应的镜像并安装,刚好本篇中的版本够线。
[root@hdp1 ~] kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
但是并不是看见created
就大功告成了,你需要查看docker的镜像,知道看到flannel镜像被下载成功并启动了对应的容器,且master状态变成ready才可以。
[root@hdp1 ~] kubectl get nodes
NAME STATUS ROLES AGE VERSION
hdp1 Ready master 61m v1.17.0
这里注意一个诡异的问题,按照管理当前一切正常并且master变成ready后,运行kubectl get pods -n kube-system
可以看到k8s系统命名空间下的pod中有一个flannel
的pod,但是我在查看的时候发现没有,但是检查镜像、master状态、容器列表都表示着flannel安装没问题,最后在朋友的提示下查询了一下所有的命名空间,才发现flannel的pod在新版中已经不属于kube-system这个系统级的命名空间了
[root@hdp1 ~] kubectl get ns
NAME STATUS AGE
default Active 78m
kube-flannel Active 21m
kube-node-lease Active 78m
kube-public Active 78m
kube-system Active 78m
[root@hdp1 ~] kubectl get pods -n kube-flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-pkw5m 1/1 Running 0 26m
到此master节点才算安装完成。
4、现在我们开始安装其他的node节点,其他node节点也需要安装k8s包,kubectl是客户端node节点如果没有连接需求可以不安装
yum install -y kubelet-1.17.0 kubeadm-1.17.0
安装完成后,从主节点上把k8s现成的配置文件cp过去
scp /etc/sysconfig/kubelet hdp2:/etc/sysconfig/
scp /etc/sysconfig/kubelet hdp3:/etc/sysconfig/
同时node节点也需要docker和k8s的系统自启
systemctl enable kubelet docker
随后运行加入master节点的命令,但注意不要直接cp过来就运行,因为上面提示给你的命令只是一个核心参数,你需要另外添加其他的配置,因为node节点在加入命令运行之后也会初始化
[root@hdp2 ~] kubeadm join 192.168.88.186:6443 --token iwhiht.j7d3xzmc5zlrr4o4 --discovery-token-ca-cert-hash sha256:4ff043695bb82b72a8982f76c92588726c88fd2fddbbd31e53e5dcfff144fd30 --ignore-preflight-errors=Swap
W1209 20:14:15.083053 1815 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks
[WARNING Swap]: running with swap on is not supported. Please disable swap
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
加入之后注意,和master一样node节点在刚加入集群的时候大概率是notready,需要等待一会,它会从master同步flannel
[root@hdp1 ~] kubectl get nodes
NAME STATUS ROLES AGE VERSION
hdp1 Ready master 102m v1.17.0
hdp2 NotReady <none> 63s v1.17.0
[root@hdp1 ~] kubectl get nodes
NAME STATUS ROLES AGE VERSION
hdp1 Ready master 105m v1.17.0
hdp2 Ready <none> 3m54s v1.17.0
hdp3 Ready <none> 2m6s v1.17.0
在master节点还可以查询到k8s系统pod情况
[root@hdp1 ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-9d85f5447-4dg48 1/1 Running 0 108m 10.244.0.3 hdp1 <none> <none>
coredns-9d85f5447-vj5z7 1/1 Running 0 108m 10.244.0.2 hdp1 <none> <none>
etcd-hdp1 1/1 Running 0 108m 192.168.88.186 hdp1 <none> <none>
kube-apiserver-hdp1 1/1 Running 0 108m 192.168.88.186 hdp1 <none> <none>
kube-controller-manager-hdp1 1/1 Running 0 108m 192.168.88.186 hdp1 <none> <none>
kube-proxy-6w698 1/1 Running 0 108m 192.168.88.186 hdp1 <none> <none>
kube-proxy-8pclr 1/1 Running 0 5m29s 192.168.88.188 hdp3 <none> <none>
kube-proxy-psjwj 1/1 Running 0 7m17s 192.168.88.187 hdp2 <none> <none>
kube-scheduler-hdp1 1/1 Running 0 108m 192.168.88.186 hdp1 <none> <none>
到此k8s集群也就安装完成了。个人自己使用完全足够。毕竟我在前面的知识点也说了,我们只是用来做测试,而不是专业做运维,没有必要做复杂的高可用。也不要有强迫症,做开发的基本不会接触到k8s,但容器引擎尝尝接触,毕竟你要交付环境和开发结果物。