前言

使用minikube部署kubernetes,实际上就是在主机上运行一个container,在容器中部署kubernetes,容器可以是docker,这种方式可以提前做好准备(包括环境、需要的镜像等),只需要用户下载好,运行即可,在本机部署测试比较方便,但是实际上的kubernetes是要直接部署在主机上的,这样才能构建多个主机组成的kubernetes集群

创建用户

kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard

用户授权

kubectl create clusterrolebinding dashboard-admin –clusterrole=cluster-admin –serviceaccount=kubernetes-dashboard:dashboard-admin
————————————————

1
2
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/abu935009066/article/details/138186651

另外部署kubernetes需要一定的硬件条件,可以网上搜索,一般就是至少两核cpu、2G内存、20G硬盘

本次安装的是1.23版本,对于最新的1.32来说,算比较老的版本了,所以在有些地方会有一点区别

部署参考文档:安装Kubernetes(k8s)

阿里云kubernetes参考文档:什么是Kubernetes(K8s)

环境准备

关闭防火墙

1
2
systemctl stop firewalld && systemctl disable firewalld && iptables -F
解释:关闭firewalld并且禁止开启自启firewalld并且清除iptables规则

关闭防火墙的原因(nftables后端兼容性问题,产生重复的防火墙规则)

Theiptablestooling can act as a compatibility layer, behaving like iptables but actually configuring nftables. This nftables backend is not compatible with the current kubeadm packages: it causes duplicated firewall rules and breakskube-proxy

上面是老版本官方文档的说法,但是新版本文档中没有这段内容了,但是没有具体测试是否还有此问题

另外,即使不考虑上面的问题,如果不关防火墙的话,一些必要的端口需要开放,具体可以网上搜索,如果为了方便,可以直接关闭,如果没有开放端口或者不确定开放哪些端口,一定要关掉防火墙,否则会引起很多网络问题,并且不好排查

关闭selinux

1
2
setenforce 0  //临时关闭
编辑/etc/selinux/config,修改'SELINUX=enforcing'为'SELINUX=disabled' //永久关闭,需要重启系统

关闭selinux的原因(关闭selinux以允许容器访问宿主机的文件系统)

Setting SELinux in permissive mode by runningsetenforce 0andsed ...effectively disables it. This is required to allow containers to access the host filesystem, which is needed by pod networks for example. You have to do this until SELinux support is improved in the kubelet

上面是老版本官方文档的说法,但是新版本文档中没有这段内容了,但是没有具体测试是否还有此问题

关闭swap分区

1
swapoff -a
1
2
sed -ri 's/.*swap.*/#&/' /etc/fstab
解释:编辑/etc/fstab,找到任何包含'swap'的行,并在其前面加上'#'

关闭swap的原因,主要是因为内存管理导致的一些问题,在老版本上是必须关闭的,不关闭swap的话,kubelet会直接启动失败,但是新版本做出了一些调整,也可以打开swap分区,但是默认还是必须关闭,需要通过配置开启kubelet支持swap分区,具体参考官方文档:交换分区的配置

知乎参考:为什么要关闭swap、selinux、firewalld

修改内核参数

1
2
3
4
5
6
7
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1 //控制着 Linux 系统中桥接流量是否被传递给 ip6tables 防火墙规则处理
net.bridge.bridge-nf-call-iptables = 1 //决定了桥接的 IPv4 流量是否会被传递给 iptables 防火墙规则进行处理
net.ipv4.ip_forward = 1 //控制着系统是否可以转发 IPv4 数据包
EOF

sysctl --system //使配置生效

关于设置net.ipv4.ip_forward = 1,官方有说明需要配置:启用 IPv4 数据包转发;而其他两个是网上参考文档中说明需要配置的,暂时未在官方文档中找到有说明,可以参考:K8s为啥要启用bridge-nf-call-iptables内核参数

加载ip_vs内核模块

kube-proxy组件支持不同的代理模式,网上的说法是ip_vs性能比iptables更好,所以尽可能使用ip_vs,默认使用的是iptables,可以参考kube-proxy 切换 proxy mode

如果kube-proxy 模式为ip_vs则必须加载,下面两种方式选择一种

1
2
3
4
5
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4

设置下次开机自动加载

1
2
3
4
5
6
7
8
9
10
cat > /etc/modules-load.d/ip_vs.conf << EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
EOF

sudo systemctl daemon-reload
sudo systemctl restart systemd-modules-load.service

通过以下命令确认是否生效,如果控制台没有打印,说明没有生效

1
lsmod | grep -E 'ip_vs|nf_conntrack_ipv4'

修改本地hosts文件

这一步是为集群做准备,编辑/etc/hosts,每台服务器都需要配置上集群中所有节点的主机名和ip(必要时修改可以通过hostnamectl set-hostname命令修改服务器的主机名),类似以下这种

1
2
3
192.168.68.106 master.local
192.168.68.107 node01.local
192.168.68.108 node02.local

容器运行时

本次安装测试使用的容器运行时是docker,安装参考:阿里云docker-ce镜像

需要注意k8s后面的版本不再支持docker作为容器运行时(需要额外安装cri-docker),推荐containerd

安装kubeadm、kubectl、kubelet

介绍

  1. kubeadm:是一个用于快速部署 Kubernetes 集群的命令行工具。它简化了集群初始化过程,并提供了建立安全最佳实践配置的途径,包括kubeadm init(创建集群)、kubeadm join(加入集群)等功能
  2. kubectl:与 Kubernetes API 交互的命令行工具,用于管理和控制 Kubernetes 集群中的资源,包括deployment、pod等资源,是我们实际应用过程中使用最多的命令
  3. kubelet:与上面两个不同,kubelet不是命令行工具,而是一个服务,它需要在正常启动的状态下才会进行工作,它的主要职责是确保容器都按照预期运行,并且负责与主节点通信以报告节点的状态,它的主要功能就是管理pod,在通过kubeadm命令建立或者加入集群后,下面的工作基本就是靠kubelet了,它会负责启动所有pod,包括服务器重启后,也是kubelet启动所有的pod,使整个k8s恢复工作

配置yum源

1
2
3
4
5
6
7
8
9
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

以上命令就是设置阿里的镜像源,目的是为了加快kubeadm这些工具的下载速度,这里有个地方需要注意,在v1.24.0开始仓库发生了变化,在配置时需要注意当前版本,具体参考:阿里云Kubernetes镜像

安装

安装指定版本的kubeadm,kubelet,kubectl,这里安装v1.23.0,网上说好像通过阿里云拉取最新版本的镜像时会有问题,需要注意

:::tips
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0 //-y代表安装过程中所有选项都选yes

:::

之前也有说到kubelet是一个服务,所以设置开机自启

:::tips
systemctl enable kubelet

:::

安装完成后遇到一个问题,就是kubelet启动不起来,看日志说是少了什么配置文件,后来网上搜了一下,在执行kubeadm init或者kubeadm join后,会自动生成这个配置文件,kubelet也会自动启动好(没有其他问题的情况下)

另外kubelet启动还需要和容器运行时使用一样的cgroup驱动,这部分内容可以参考官方:cgroup 驱动

kubeadm创建集群时,如果没有单独给kubelet配置cgroup,kubeadm会默认给kubelet配置systemd cgroup

配置容器运行时的驱动,这里以docker举例,在/etc/docker/daemon.json中设置以下内容,如果文件中已经有内容了,则将下面大括号里的配置加入到原先内容的大括号当中,配置完重启docker即可

:::tips
{“exec-opts”: [“native.cgroupdriver=systemd”]}

:::

部署Kubernetes Master节点

部署

通过kubeadm构建kubernetes集群可参考官方文档:使用kubeadm创建集群

在主节点服务器上执行以下命令

1
2
3
4
5
6
kubeadm init \
--kubernetes-version 1.23.0 \
--apiserver-advertise-address=0.0.0.0 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.245.0.0/16 \
--image-repository registry.aliyuncs.com/google_containers
  1. –kubernetes-version:指定版本,需要和上边安装的kubelet,kubead,kubectl保持一致
  2. –apiserver-advertise-address:为通告给其它组件的IP,一般应为master节点的IP地址
  3. –service-cidr:指定service网络,不能和node网络冲突
  4. –pod-network-cidr:指定pod网络,不能和node网络、service网络冲突
  5. –image-repository:定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,如果k8s版本比较新,可能阿里云没有对应的镜像,就需要自己从其它地方获取镜像了。

下面正常启动下的日志,包括拉取镜像(也可以提前拉取,比如通过kubeadm –kubernetes-version 1.23.0 config images pull)、创建配置文件等

下面是启动成功后的日志

  1. 第一个红框是本机配置kubectl需要执行的命令,分别执行完这几条命令之后,就可以使用kubectl操作kubernetes集群资源了
  2. 第二个红框是启动服务器再加入kubernetes集群时,需要执行的命令,所以这条命令需要记录下来,如果后续忘记了,可以执行以下命令,会打印一条kubeadm join命令

:::tips
kubeadm token create –print-join-command

:::

设置Master可调度

master节点默认是不可被调度的,即除了k8s本身的pod以外,不能运行其他pod了,比如我们部署自己的pod,会自动部署到Worker节点,这是因为污染点造成的,如果出于某些考虑,需要master也可以部署我们自己的pod,把污染点去掉就好了

参考:K8s设置Master可调度与不可调度

涉及以下几条命令

1
2
3
4
5
kubectl describe node <master node name> | grep Taint  //查看主节点污染点
kubectl taint node <master node name> node-role.kubernetes.io/control-plane:NoSchedule- //去除主节点control-plane角色不可调度污染点
kubectl taint node <master node name> node-role.kubernetes.io/master:NoSchedule- //去除主节点master角色不可调度污染点
kubectl taint node <master node name> node-role.kubernetes.io/control-plane=:NoSchedule //恢复主节点主节点control-plane角色不可调度污染点
kubectl taint node <master node name> node-role.kubernetes.io/master=:NoSchedule //恢复主节点master角色不可调度污染点

部署Kubernetes Worker节点

这里需要注意,在worker节点的服务器上也需要做好环境准备和kubeadm等工具安装的工作,然后在worker节点运行上面记录的命令即可,比如这里是

1
2
kubeadm join 192.168.255.101:6443 --token jq3eqc.9y1y3h89kljjipjm \
--discovery-token-ca-cert-hash sha256:275b115804658388bba00267d5cfd85f04c31d6ab45c141093e890b4d72f5e91

下面是运行成功的日志

运行完之后,回到主节点执行kubectl get node查看节点状态

发现两个节点都是NotReady,因为缺失网络插件导致的,缺失网络插件会导致CoreDNS无法启动,具体参考:安装 Pod 网络附加组件

安装网络插件flannel

具体可以参考官方文档:安装联网和网络策略插件

这里选择安装flannel,只需要安装即可

  1. 从官网下载yml文件

:::tips
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

:::

修改文件

修改文件中的Network,使其与kubeadm init中的pod-network-cidr参数一致

修改前 修改后

  1. 然后执行yml文件

:::tips
kubectl apply -f kube-flannel.yml

:::

执行后查看flannel,这里是拿新版本的flannel举例,旧版本的flannel在kube-system命名空间下

:::tips
kubectl get pod -n kube-flannel -o wide

:::

发现启动正常,但是继续查看node,发现已经是Ready了

在实际安装过程中,安装完flannel后,coreDns还是没有启动,一直出于Pending状态,如果在安装flannel后,发现同样的情况,可以参考这篇文章:coredns总处于Pending状态,解决方法

安装dashboard

介绍

minikube部署k8s,默认是包含了dashboard的,但是kabeadm部署没有,所以我们自己装一个,官网有安装及使用教程,但是是最新版本的,这里介绍以下较新的版本和老的版本安装上的区别(具体以哪个版本为分界线参考github)

helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/

helm upgrade –install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard –create-namespace –namespace kubernetes-dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

关于dashboard和kubernetes版本对应问题,github releases界面也有介绍,可以到具体版本的releases界面查看,下面是个例子

安装

这里由于我们安装的kuernetes版本为1.23.0,所以这里安装v2.5.0的dashboard,这里不选择在线安装,因为需要修改yaml文件,所以通过离线安装

  1. 下载yaml文件
1
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
  1. 修改文件:这里主要是修改生成的Service的type,该yaml文件对于生成的service没有设置type,即type默认为ClusterIP,这种模式不会生成静态端口,就没有办法从外部访问,所以需要设置type为NodePort,找到文件中service,加上type设置,如下图,途中最下面的type就是我们手动要加的

  1. 部署dashboard,这里使用kubectl apply即可
1
kubectl apply -f recommended.yaml

安装完之后通过kubeclt get pod命令查看安装情况,如下图

查看service,获取静态端口

  1. 访问dashboard,但是这里还需要授权登录

  1. 创建用户(管理员),并且获取token
1
2
3
4
5
6
# 创建用户:dashboard-admin
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 用户授权:创建一个集群角色绑定:dashboard-admin-binding,这个绑定的作用是将cluster-admin角色赋予上面创建的dashboard-admin用户
kubectl create clusterrolebinding dashboard-admin-binding --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
#获取token,找到 dashboard-admin 服务账户的第一个 Secret,然后从中提取出 Base64 编码的令牌,并将其解码为可读文本形式输出
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/dashboard-admin -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
   将上面第三个命令返回的结果输入到web界面中(token模式授权),就可以进入dashboard了


本站总访问量:次本站总访问数:人
本站由 Peng Tong 使用 Stellar 1.29.1 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。