Kubernetes(k8s)安装以及搭建k8s-Dashboard详解

Kubernetes(k8s)安装以及搭建k8s-Dashboard详解

一、前期准备

1)前提条件

  • 三台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 – – Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。
  • 开启机器上的某些端口。
  • 禁用交换分区。为了保证 kubelet 正常工作,必须 禁用交换分区。

2)机器信息

机器类型

操作系统

网卡

IP

节点类型

VMware虚拟机

centos8

ens33

192.168.0.113

k8s-master

VMware虚拟机

centos8

ens33

192.168.0.114

k8s-node1

VMware虚拟机

centos8

ens33

192.168.0.115

k8s-node2

修改主机名

# 在192.168.0.113执行$ hostnamectl set-hostname k8s-master# 在192.168.0.114执行$ hostnamectl set-hostname k8s-node1# 在192.168.0.115执行$ hostnamectl set-hostname k8s-node2

时间同步

$ yum install chrony -y$ systemctl start chronyd$ systemctl enable chronyd$ chronyc sources

3)确保每个节点上 MAC 地址和 product_uuid 的唯一性

  • 你可以使用命令 ip link来获取网络接口的 MAC 地址
  • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 失败。

4)允许 iptables 检查桥接流量(可选)

  • 确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter。
  • 为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。所有节点都执行以下命令:

$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOF$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF# 手动加载所有的配置文件$ sudo sysctl –system

5)检查所需端口

=》master节点

协议

方向

端口范围

作用

使用者

TCP

入站

6443

Kubernetes API 服务器

所有组件

TCP

入站

2379-2380

etcd

服务器客户端 API

TCP

入站

10250

Kubelet API

kubelet 自身、控制平面组件

TCP

入站

10251

kube-scheduler

kube-scheduler 自身

TCP

入站

10252

kube-controller-manager

kube-controller-manager 自身

=》node(work)节点

协议

方向

端口范围

作用

使用者

TCP

入站

10250

Kubelet API

kubelet 自身、控制平面组件

TCP

入站

30000-32767

NodePort 服务

所有组件

NodePort 服务 的默认端口范围。

二、安装 runtime

为了在 Pod 中运行容器,Kubernetes 使用 容器运行时(Container Runtime)。

默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。

如果你不指定运行时,则 kubeadm 会自动尝试检测到系统上已经安装的运行时, 方法是扫描一组众所周知的 Unix 域套接字。 下面的表格列举了一些容器运行时及其对应的套接字路径:

运行时

域套接字

Docker

/var/run/dockershim.sock

containerd

/run/containerd/containerd.sock

CRI-O

/var/run/crio/crio.sock

如果同时检测到 Docker 和 containerd,则优先选择 Docker。 这是必然的,因为 Docker 18.09 附带了 containerd 并且两者都是可以检测到的, 即使你仅安装了 Docker。 如果检测到其他两个或多个运行时,kubeadm 输出错误信息并退出。kubelet 通过内置的 dockershim CRI 实现与 Docker 集成。

装完docker后会仅有containerd

containerd简介

containerd是一个工业级标准的容器运行时,它强调简单性、健壮性和可移植性。containerd可以在宿主机中管理完整的容器生命周期,包括容器镜像的传输和存储、容器的执行和管理、存储和网络等。

Docker vs containerd

containerd是从Docker中分离出来的一个项目,可以作为一个底层容器运行时,现在它成了Kubernete容器运行时更好的选择。

K8S为什么要放弃使用Docker作为容器运行时,而使用containerd呢?

如果你使用Docker作为K8S容器运行时的话,kubelet需要先要通过 dockershim 去调用Docker,再通过Docker去调用containerd。

如果你使用containerd作为K8S容器运行时的话,由于containerd内置了 CRI (Container Runtime Interface:容器运行时接口)插件,kubelet可以直接调用containerd。

所有机器安装docker步骤如下

# 安装yum-config-manager配置工具$ yum -y install yum-utils# 设置yum源$ yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 安装docker-ce版本$ sudo yum install -y docker-ce# 启动$ sudo systemctl start docker# 开机自启$ sudo systemctl enable docker# 查看版本号$ sudo docker –version# 查看版本具体信息$ sudo docker version# Docker镜像源设置# 修改文件 /etc/docker/daemon.json,没有这个文件就创建# 添加以下内容后,重启docker服务:{ “registry-mirrors”: [“http://hub-mirror.c.163.com”]}$ sudo systemctl restart docker

三、安装 kubeadm、kubelet 和 kubectl

你需要在所有机器上安装以下的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

kubeadm 不能 帮你安装或者管理 kubelet 或 kubectl,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。

1)配置hosts

$ echo “192.168.0.113 k8s-master” >> /etc/hosts$ echo “192.168.0.114 k8s-node1” >> /etc/hosts$ echo “192.168.0.115 k8s-node2” >> /etc/hosts# 查看$ cat /etc/hosts

2)关闭防火墙

$ systemctl stop firewalld$ systemctl disable firewalld

3)关闭swap

kubelet 在 1.8 版本以后强制要求 swap 必须关闭。要不然kubelet 无法正常启动

# 临时关闭;关闭swap主要是为了性能考虑$ swapoff -a# 可以通过这个命令查看swap是否关闭了$ free# 永久关闭 $ sed -ri ‘s/.*swap.*/#&/’ /etc/fstab

4)将 SELinux 设置为 disabled模式(相当于将其禁用)

# 临时关闭$ sudo setenforce 0 # 永久禁用$ sudo sed -i ‘s/^SELINUX=enforcing$/SELINUX=disabled/’ /etc/selinux/config

5)配置yum源,这里配置阿里云的源

$ cat > /etc/yum.repos.d/kubernetes.repo << EOF[k8s]name=k8senabled=1gpgcheck=0baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/EOF

6)开始安装kubeadm,kubelet和kubectl

$ sudo yum install -y kubelet kubeadm kubectl –disableexcludes=kubernetes# disableexcludes=kubernetes:禁掉除了这个kubernetes之外的别的仓库# 设置为开机自启并现在立刻启动服务 –now:立刻启动服务$ sudo systemctl enable –now kubelet# 查看状态$ systemctl status kubelet

查看状态会发现

重新安装(或第一次安装)k8s,未经过kubeadm init 或者 kubeadm join后,kubelet会不断重启,这个是正常现象……,执行init或join后问题会自动解决,对此官网有如下描述,也就是此时不用理会kubelet.service。

先查看k8s版本

$ kubectl version$ yum info kubeadm

7)使用 kubeadm 创建集群(master节点)

初始化,–kubernetes-version版本就是上面查询出来的,可以不写,默认会自动获取版本,–image-repository:默认是官网k8s.gcr.io,但是很慢,这里换成了阿里云的;–apiserver-advertise-address=192.168.0.113:这里的ip为master节点ip,记得更换。

$ kubeadm init –apiserver-advertise-address=192.168.0.113 –image-repository registry.aliyuncs.com/google_containers –kubernetes-version v1.22.1 –service-cidr=10.1.0.0/16 –pod-network-cidr=10.244.0.0/16# –image-repository string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers# –kubernetes-version string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号,我们可以将其指定为固定版本(v1.22.1)来跳过网络请求。# –apiserver-advertise-address 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。# –pod-network-cidr 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。

但是会报如下错误:registry.aliyuncs.com/google_containers/coredns:v1.8.4 not found

【解决】由于安装的是Kubernetes v1.22.1版本,在初始化的时候报错信息中提示需要registry.aliyuncs.com/google_containers/coredns:v1.8.4版本的coredns镜像,手动拉取registry.aliyuncs.com/google_containers/coredns:v1.8.4版本的镜像时发现没有,所以就只能拉取一个默认版本的阿里云coredns镜像,拉取下来之后自己再手动修改一下镜像的tag信息为v1.8.4版本。

# 手动拉取默认版本的coredns镜像$ docker pull registry.aliyuncs.com/google_containers/coredns

查看拉取下来的coredns镜像

$ docker images

将拉取的默认版本的coredns镜像tag信息修改为v1.8.4版本

$ docker tag registry.aliyuncs.com/google_containers/coredns:latest registry.aliyuncs.com/google_containers/coredns:v1.8.4 $ docker images

再执行上面初始化命令

$ kubeadm init –apiserver-advertise-address=192.168.0.113 –image-repository registry.aliyuncs.com/google_containers –kubernetes-version v1.22.1 –service-cidr=10.1.0.0/16 –pod-network-cidr=10.244.0.0/16

报错如下:

$ tail /var/log/messages

上述日志表明:kubelet的cgroup driver是cgroupfs,docker的 cgroup driver是systemd,两者cgroup driver不一致导致kubelet启动失败。

【解决】

  • 修改kubelet的Cgroup Driver(这里不修改kubelet的)修改/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf文件,增加–cgroup-driver=cgroupfs
  • 重启kubelet

    $ systemctl daemon-reload$ systemctl restart kubelet

    这里不真正用这个方式,而是修改docker的cgroup driver2. 修改docker的cgroup driver(修改docker的,也就是这个方式),修改或创建/etc/docker/daemon.json,加入下述内容:

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

    重启docker

    $ cat /etc/docker/daemon.json$ systemctl daemon-reload$ systemctl restart docker# 查看docker的cgroup driver$ docker info | grep Cgroup

    先重置

    # 重置$ kubeadm reset# 重启$ systemctl restart kubelet

    重新初始化

    $ kubeadm init –apiserver-advertise-address=192.168.0.113 –image-repository registry.aliyuncs.com/google_containers –kubernetes-version v1.22.1 –service-cidr=10.1.0.0/16 –pod-network-cidr=10.244.0.0/16

    根据上图提示,要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:

    $ mkdir -p $HOME/.kube$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

    或者,如果你是 root 用户,则可以运行,这里我使用root用户,但是生产环境一般不会用root用户的:

    # 临时生效(退出当前窗口重连环境变量失效)$ export KUBECONFIG=/etc/kubernetes/admin.conf# 永久生效(推荐)$ echo “export KUBECONFIG=/etc/kubernetes/admin.conf” >> ~/.bash_profile$ source ~/.bash_profile

    如果不加入环境变量,会出现如下报错:

    8)安装Pod网络插件(CNI:Container Network Interface)(master)

    你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。

    $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    如果上面安装失败,则下载我百度里的,离线安装

    链接:https://pan.baidu.com/s/1HB9xuO3bssAW7v5HzpXkeQ提取码:8888

    $ kubectl apply -f kube-flannel.yml$ docker images

    查看集群信息

    $ kubectl get nodes

    9)Node节点加入集群

    如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

    $ kubeadm token list

    默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

    $ kubeadm token create# 再查看$ kubeadm token list

    如果你没有 –discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:

    $ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’

    如果执行kubeadm init时没有记录下加入集群的命令,可以通过以下命令重新创建(推荐)一般不用上面的分别获取token和ca-cert-hash方式,执行以下命令一气呵成:

    $ kubeadm token create –print-join-command


    以下命令在node节点执行**

    # 查看集群信息$ kubectl get nodes

    【问题】这里可能会报错 localhost:10248拒绝访问,这个无解,重装系统解决

    【解决】重置节点信息

    $ kubeadm reset

    需要将master节点的 /etc/kubernetes/admin.conf复制到node节点的相同位置

    $ scp /etc/kubernetes/admin.conf 192.168.0.114:/etc/kubernetes/$ scp /etc/kubernetes/admin.conf 192.168.0.115:/etc/kubernetes/

    执行下面的代码加入环境变量

    $ echo “export KUBECONFIG=/etc/kubernetes/admin.conf” >> ~/.bash_profile$ source ~/.bash_profile

    修改docker的cgroup driver,修改或创建/etc/docker/daemon.json,加入下述内容:

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

    重新加载

    $ systemctl daemon-reload$ systemctl restart docker$ docker info | grep Cgroup$ kubectl get nodes

    安装flannel网络插件,采用离线安装,kube-flanel.yml文件上面有

    $ kubectl apply -f kube-flannel.yml

    将node节点加入到集群中

    $ kubeadm token create –print-join-command# –v=5:显示详细信息$ kubeadm join 192.168.0.113:6443 –token cgmxso.bfgou00m72tnbpz4 –discovery-token-ca-cert-hash sha256:b4792b0f3b54c8b8b71a4a484129b4e2acfe5014c37b1b18dbebbc0c8f69fc15 –v=5

    另一个node节点同上操作

    【问题】STATUS一直为NotReady首先使用如下命令来看一下kube-system的 pod 状态:

    $ kubectl get pod -n kube-system$ kubectl get pod -n kube-system -o wide

    如上,可以看到 pod kube-flannel 的状态是ImagePullBackoff,意思是镜像拉取失败了,所以我们需要手动去拉取这个镜像。这里可以看到某些 pod 运行了两个副本是因为我有两个节点存在了。

    也可以通过kubectl describe pod -n kube-system 来查看某个服务的详细情况,如果 pod 存在问题的话,你在使用该命令后在输出内容的最下面看到一个[Event]条目,如下:

    $ kubectl describe pod kube-flannel-ds-4j2mp -n kube-system

    【解决】手动拉取镜像

    $ docker pull quay.io/coreos/flannel:v0.14.0

    修改完了之后过几分钟 k8s 会自动重试,等一下就可以发现不仅flannel正常了,其他的 pod 状态也都变成了Running,这时再看 node 状态就可以发现问题解决了:

    四、清理

    如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。你可以使用 kubectl config delete-cluster 删除对集群的本地引用。

    1)先将节点设置为维护模式(k8s-node1是节点名称)

    $ kubectl drain k8s-node1 –delete-local-data –force –ignore-daemonsets

    2)在删除节点之前,请重置 kubeadm 安装的状态:

    $ kubeadm reset

    3)重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:

    $ iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

    4)如果要重置 IPVS 表,则必须运行以下命令:

    $ ipvsadm -C

    5)现在删除节点:

    $ kubectl delete node k8s-node1

    五、搭建K8S Dashboard

    1)下载dashboard文件:

    $ curl -o kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml

    如果地址不可用可以使用下面的地址下载

    链接:https://pan.baidu.com/s/1-tEablkFTrMC-N9-8T7rrA提取码:8888

    安装

    $ kubectl apply -f kubernetes-dashboard.yaml

    验证,查看服务被分配到哪个节点上:$ kubectl get pods -n kube-system -o wide

    $ kubectl get pods -n kube-system -o wide

    从上图可知,服务被分配到了k8s-node1,对外端口为nodePort:31080,配置文件里的。谷歌浏览器访问不了,原因是部署UI的镜像中默认自带的证书是一个不可信任的证书,则先用火狐访问:https://nodeIp:nodePort

    https://192.168.0.114:31080

    获取token测试

    $ kubectl get secret -n kube-system|grep kubernetes-dashboard-token# 根据自己情况输入命令$ kubectl describe secret kubernetes-dashboard-token-m7b7b -n kube-system

    解决谷歌浏览器不能访问的问题,通过生成新的证书永久解决

    # 创建一个用于自签证书的目录$ mkdir kubernetes-dashboard-key && cd kubernetes-dashboard-key # 生成证书请求的key$ openssl genrsa -out dashboard.key 2048 # 192.168.0.113为master节点的IP地址$ openssl req -new -out dashboard.csr -key dashboard.key -subj ‘/CN=192.168.0.113’ # 生成自签证书$ openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt# 删除原有证书$ kubectl delete secret kubernetes-dashboard-certs -n kube-system# 创建新证书的secret$ kubectl create secret generic kubernetes-dashboard-certs –from-file=dashboard.key –from-file=dashboard.crt -n kube-system# 查找正在运行的pod$ kubectl get pod -n kube-system# 删除pod,让k8s自动拉起一个新的pod,相对于重启kubectl delete pod kubernetes-dashboard-7d6c598b5f-fvcg8 -n kube-system

    服务调度到k8s-node2节点上了,访问

    https://192.168.0.115:31080

    现在Google浏览器也可以访问了再获取token登录

    $ kubectl get secret -n kube-system|grep kubernetes-dashboard-token# 根据自己情况输入命令$ kubectl describe secret kubernetes-dashboard-token-m7b7b -n kube-system

    以上就是完整版K8s和K8s Dashboard的安装过程了~

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年6月13日
    下一篇 2022年6月13日

    相关推荐

    • 半主力两球取胜不足为喜,三大问题仍待水庆霞解决

      今天下午,经过两个小时的较量,中国女足2-0击败本届东亚杯的首个对手中国台北。上下半场主教练水庆霞尝试了不同的战术打法,也让年轻队员得到了比赛机会。 上半场,张琳艳和吴澄舒冲击边路…

      2022年7月22日
    • CAD如何快速统计多个封闭区域的总面积

      CAD如何快速统计多个封闭区域的总面积呢,现在大家一起来看看吧。 CAD如何快速统计多个封闭区域的总面积 1、计算多个封闭区域的面积这里需要一个CAD插件 分享链接:http://…

      2022年5月16日
    • 未来网络什么样?“重磅登场”的创新成果将带来视听盛宴

      来源:【新华日报】 第六届未来网络发展大会召开在即,为让公众更直观地了解未来网络如何走进生活,“2022未来网络创新技术与成果展”(下称“创新展”)将于8月24日至25日与大会同步…

      2022年8月14日
    • 什么是薛定谔的猫?

      薛定谔的猫是奥地利物理学家埃尔温-薛定谔在1935年做出的一个思想实验。 准备一个带盖子的密封盒子,把一只猫放在这个盒子里, 盒子里还有其他少量的放射性物质。 放射性物质有50%的…

      2022年8月6日
    • 日本妈妈们穿衣简单优雅,掌握这个穿搭技巧,50岁也能像30岁那样

      有很多日本妈妈,孩子长大成人后,育儿也就告一段落。他们会享受美食、美好的事物和美好的生活。她们认为,正因为是这个年纪,经历了很多事,更应该珍惜当下所遇见的一切,开心地度过每一天就会…

      2022年6月30日
    • 英国多地进入“火炉”状态 谷歌甲骨文服务器“热瘫”

      【环球时报综合报道】本周,英国多地进入“火炉”状态。据英国广播公司(BBC)20日报道,热浪来袭之际,科技巨头谷歌和甲骨文因伦敦数据中心的冷却系统出现故障,导致部分网站瘫痪。 甲骨…

      2022年7月23日
    • 游族网络:正进行《三体》系列IP游戏开发 预计未来3-5年陆续推向市场

      e公司讯,游族网络(002174)在业绩说明会上表示,公司正在进行的《三体》系列IP游戏开发,预计将于未来3-5年陆续推向市场。

      2022年7月2日
    • 「大道成」网络货运在物流行业中如何运作?

      当前国内传统物流企业信息化水平较低,加速互联网+物流是降本增效的关键因素,面对目前的挑战,部分企业开始依靠大数据处理技术实现货运业务整合及升级,网络货运平台因此孕育而生。 从整个物…

      2022年6月12日
    • 女人睡觉前:避免前2个坏习惯,坚持后2个好习惯,会越来越年轻

      护肤是每一个女人都比较重视的事情,运用正确的护肤方法,挑对正确的时间来护肤,不仅可以使自己的皮肤稳定在健康稳定的状态,随着年龄的增长,你的皮肤相对会维持在一个比较年轻的状态。 虽然…

      2022年8月26日
    • 一杯浊酒敬流年

      图片来自网络 “半生风雨半生寒,一杯浊酒敬流年,回首过往半生路,七分酸楚三分甜……” 时光匆匆,如白驹过隙忽然而已,不觉间已走过半生。历经人生风风雨雨,尝遍世间酸甜苦辣,看尽百般世…

      2022年8月14日

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息