知识点14--搭建k8s本地单master测试集群

首先要做安装前的准备:

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一样,但是切记不要和宿主机网段冲突,因为单跑docker可以自定义网络策略并且桥接继承宿主机的网卡,但是k8s不能这样用,它有一套自己独有的网络模式,而且其本身也会生成几张特有的网卡,如果占了宿主机的网络策略会造成冲突的。并且你这里设置的pod网络策略往后所有加入的note节点都会使用该策略
--service-cidr Service的ip和pod网络一样的情况,所以也选一个没被占用的,虽然service本质上也是一个附件类pod,但是它的不融于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,但容器引擎尝尝接触,毕竟你要交付环境和开发结果物。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值