Kubernetes集群 v1.27.3

1|0生产级别的容器编排系统

Kubernetes 介绍

k8s

Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,它是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。

传统部署时代:

早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。

虚拟化部署时代:

因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代:

容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

容器因具有许多优势而变得流行起来,例如:

  • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
  • 可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
  • 跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
  • 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率和高密度。

Kubernetes 作用:

容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些? Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。

Kubernetes 提供:

  • 服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器.如果进入容器的流量很大, Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

  • 自动部署和回滚

    你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

  • 自动完成装箱计算

    你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM),Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

  • 自我修复

    Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

  • 密钥与配置管理

    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

2|0基础环境

三个节点均需操作,以k8s-master为例

主机节点 进程 IP配置 操作系统
k8s-master docker,kube-apiserver,etcd,kube-scheduler,kube-controller-manager,kubelet,kube-proxy,coredns,calico Net:10.10.20.10 Centos8-Stream
k8s-worker01 docker,kubelet,kube-proxy,calico Net:10.10.20.20 Centos8-Stream
k8s-worker02 docker,kubelet,kube-proxy,calico Net:10.10.20.30 Centos8-Stream

2|1主机名配置与IP映射

#k8s-master [root@localhost ~]# hostnamectl set-hostname k8s-master [root@localhost ~]# bash [root@k8s-master ~]# cat >>/etc/hosts<<EOF 10.10.20.10 k8s-master 10.10.20.20 k8s-worker01 10.10.20.30 k8s-worker02 EOF #k8s-worker01 [root@localhost ~]# hostnamectl set-hostname k8s-worker01 [root@localhost ~]# bash [root@k8s-worker01 ~]# cat >>/etc/hosts<<EOF 10.10.20.10 k8s-master 10.10.20.20 k8s-worker01 10.10.20.30 k8s-worker02 EOF #k8s-worker02 [root@localhost ~]# hostnamectl set-hostname k8s-worker02 [root@localhost ~]# bash [root@k8s-worker02 ~]# cat >>/etc/hosts<<EOF 10.10.20.10 k8s-master 10.10.20.20 k8s-worker01 10.10.20.30 k8s-worker02 EOF

2|2SSH-Key密钥认证

#在master节点上⽣成密钥⽂件,拷⻉到其它节点,测试免密登录 [root@k8s-master ~]# ssh-keygen ........(回车就完了) [root@k8s-master ~]# for i in 10 20 30; do ssh-copy-id 10.10.20.$i; done .......(输密码即可,此处省略过程) #将worker01,worker02密钥给master [root@k8s-worker01 ~]# ssh-keygen ........(回车就完了) [root@k8s-worker01 ~]# ssh-copy-id k8s-master [root@k8s-worker02 ~]# ssh-keygen ........(回车就完了) [root@k8s-worker02 ~]# ssh-copy-id k8s-master #验证 [root@k8s-master ~]# ssh k8s-worker01 [root@k8s-master ~]# ssh k8s-worker02

2|3IP路由转发开启,转发 IPv4

#添加⽹桥的⽹络转发及内核转发配置⽂件 [root@k8s-master ~]# cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 EOF #加载br_netfilter模块 && 查看是否加载 [root@k8s-master ~]# modprobe br_netfilter && lsmod | grep br_netfilter br_netfilter 24576 0 bridge 290816 1 br_netfilter #加载⽹桥过滤及内核转发配置⽂件 [root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0

2|4配置yum源

#使用阿里云Centos 8的源,地址:https://mirrors.aliyun.com #配置centos8 [root@k8s-master ~]# mkdir /etc/yum.repos.d/Centos8 [root@k8s-master ~]# mv /etc/yum.repos.d/CentOS-Stream-* /etc/yum.repos.d/Centos8 [root@k8s-master ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo [root@k8s-master ~]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo #配置Kubernetes [root@k8s-master ~]# 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 #清理缓存,建立缓存 [root@k8s-master ~]# yum clean all [root@k8s-master ~]# yum -y makecache

2|5配置ipvs功能

在kubernetes中Service有两种代理模型,⼀种是基于iptables的,⼀种是基于ipvs,两者对⽐ipvs的性能要⾼,如果想要使⽤ipvs模型,需要⼿动载⼊ipvs模块

#安装ipset及ipvsadm [root@k8s-master ~]# dnf -y install ipset ipvsadm #添加需要加载的模块 [root@k8s-master ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF #授权、运⾏、检查是否加载 [root@k8s-master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack ip_vs_sh 16384 0 ip_vs_wrr 16384 0 ip_vs_rr 16384 0 ip_vs 172032 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr nf_conntrack 172032 1 ip_vs nf_defrag_ipv6 20480 2 nf_conntrack,ip_vs nf_defrag_ipv4 16384 1 nf_conntrack libcrc32c 16384 3 nf_conntrack,xfs,ip_vs

2|6关闭Swap分区,防火墙,SeLinux

#永远关闭swap分区,需要重启操作系统 [root@k8s-master ~]# vi /etc/fstab #/dev/mapper/cs-swap none swap defaults 0 0 #关闭防火墙设置开机自动关闭 [root@k8s-master ~]# systemctl disable --now firewalld #关selinux,设置永久关闭 [root@k8s-master ~]# vi /etc/selinux/config SELINUX=disabled #重启虚拟机使配置生效 [root@k8s-master ~]# reboot

2|7验证基础配置

#验证SELinux是否为disabled [root@k8s-master ~]# getenforce Disabled #验证swap交换分区 [root@k8s-master ~]# free -h total used free shared buff/cache available Mem: 1.9Gi 160Mi 1.6Gi 8.0Mi 184Mi 1.6Gi Swap: 0B 0B 0B #验证防火墙 [root@k8s-master ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)

3|0Docker

k8s是容器编排工具,需要容器管理工具,三个节点同时安装docker

二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/

3|1安装Docker

[root@k8s-master ~]# wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.2.tgz #解压 [root@k8s-master ~]# tar xf docker-24.0.2.tgz #拷贝二进制执行文件 [root@k8s-master ~]# cp docker/* /usr/bin/

3|2配置docker镜像加速器

[root@k8s-master ~]# mkdir /etc/docker [root@k8s-master ~]# vi /etc/docker/daemon.json { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", "https://docker.m.daocloud.io", "http://hub-mirrors.c.163.com"], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "data-root": "/var/lib/docker" }

3|3配置Cgroup驱动程序

在 Linux 上,控制组(CGroup)⽤于限制分配给进程的资源,官⽅建议配置容器运⾏时和 kubelet 使⽤ systemd(systemd是Linux系统第⼀个初始进程)作为容器的控制组(CGroup), 以此使系统更为稳定 。

#在/etc/docker/daemon.json添加如下内容,别忘了在前一条配置后面加逗号!!! "exec-opts": ["native.cgroupdriver=systemd"] [root@k8s-master ~]# vi /etc/docker/daemon.json [root@k8s-master ~]# cat /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", "https://docker.m.daocloud.io", "http://hub-mirrors.c.163.com"], "max-concurrent-downloads": 10, "log-driver": "json-file", "log-level": "warn", "data-root": "/var/lib/docker" }

3|4配置docker服务

#containerd.service [root@k8s-master ~]# vi /etc/systemd/system/containerd.service [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=1048576 TasksMax=infinity OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target #docker.service [root@k8s-master ~]# vi /etc/systemd/system/docker.service [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service containerd.service Wants=network-online.target Requires=docker.socket containerd.service [Service] Type=notify ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process OOMScoreAdjust=-500 [Install] WantedBy=multi-user.target #docker.socket [root@k8s-master ~]# vi /etc/systemd/system/docker.socket [Unit] Description=Docker Socket for the API [Socket] ListenStream=/var/run/docker.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target

3|5启动docker服务

[root@k8s-master ~]# systemctl daemon-reload [root@k8s-master ~]# systemctl enable --now containerd.service && systemctl enable --now docker.service && systemctl enable --now docker.socket

3|6查看版本和信息

[root@k8s-master ~]# docker --version [root@k8s-master ~]# docker info

4|0cri-docker

Kubernetes1.24以及更高版本已不支持docker,所以要安装cri-docker

4|1安装cri-docker

[root@k8s-master ~]# wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.3/cri-dockerd-0.3.3.amd64.tgz #解压 [root@k8s-master ~]# tar xf cri-dockerd-0.3.3.amd64.tgz #拷贝二进制执行文件 [root@k8s-master ~]# cp cri-dockerd/* /usr/bin/

4|2配置cri-docker服务

#cri-docker.service [root@k8s-master cri-dockerd]# vi /usr/lib/systemd/system/cri-docker.service [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target #cri-docker.socket [root@k8s-master ~]# vi /usr/lib/systemd/system/cri-docker.socket [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target

4|3启动cri-docker服务

[root@k8s-master ~]# systemctl daemon-reload [root@k8s-master ~]# systemctl enable --now cri-docker

4|4查看cri-docker状态

[root@k8s-master ~]# systemctl is-active cri-docker active

5|0kubelet,kubeadm,kubectl

三个节点都需安装kubelet,kubeadm,kubectl

介绍:

Kubelet 是 kubernetes 工作节点上的一个代理组件,运行在每个节点上

Kubeadm 是一个快捷搭建kubernetes(k8s)的安装工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令来快速创建 kubernetes 集群,kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群

Kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署

5|1安装kubelet,kubeadm,kubectl

#这里采用的选项是--disableexcludes,即“禁止从主配置,从源或者从任何位置排除”,意思是排除这个选项后面跟的参数以外的其他所有仓库 [root@k8s-master ~]# yum -y install kubelet kubeadm kubectl --disableexcludes=kubernetes #为保证三个组件与工具版本的统一性 kubeadm-1.27.3-0.x86_64 kubectl-1.27.3-0.x86_64 kubelet-1.27.3-0.x86_64

5|2设置kubelet开机自启动

[root@k8s-master ~]# systemctl enable --now kubelet Created symlink /etc/systemd/system/multi-user.target.wants/kubelet.service → /usr/lib/systemd/system/kubelet.service. #初始化前kubelet是无法启动的,但可以查看它的状态,目前在等待指令 [root@k8s-master ~]# systemctl is-active kubelet activating

6|0kubeadm初始化

6|1查看版本

[root@k8s-master ~]# yum list --showduplicates kubeadm --disableexcludes=kubernetes Last metadata expiration check: 11:54:21 ago on Tue 27 Jun 2023 10:00:07 PM CST. Installed Packages kubeadm.x86_64 1.27.3-0 @kubernetes Available Packages kubeadm.x86_64 1.6.0-0 kubernetes kubeadm.x86_64 1.6.1-0 kubernetes kubeadm.x86_64 1.6.2-0 kubernetes kubeadm.x86_64 1.6.3-0 kubernetes kubeadm.x86_64 1.6.4-0 kubernetes kubeadm.x86_64 1.6.5-0 kubernetes kubeadm.x86_64 1.6.6-0 kubernetes ........(略)

6|2初始化开始(仅在k8s-master上执行)

--image-repository registry.aliyuncs.com/google_containers:使用阿里云镜像仓库
--kubernetes-version=v1.27.3:指定k8s的版本
--pod-network-cidr=192.168.0.0/24:指定pod的网段(默认网段)

--cri-socket unix:///var/run/cri-dockerd.sock:指定容器运行时的Socket文件路径,原本默认是dockershim.sock,但现在改成cri-docker.sock

[root@k8s-master ~]# kubeadm init \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.27.3 \ --pod-network-cidr=192.168.0.0/16 \ --cri-socket unix:///var/run/cri-dockerd.sock .......(略) 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 Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf 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 10.10.20.10:6443 --token k4mb93.ur06ejhmuohagd64 --discovery-token-ca-cert-hash sha256:38f126c56e9b22e3e75aa9e9aed7bc23b2954c191853d095b94581867dd2269a #信息提示出现token,可以用它将worker节点加入到集群中

6|3根据初始化指示,创建kubeconfig文件

[root@k8s-master ~]# mkdir -p $HOME/.kube [root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config [root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

6|4Worker节点加入集群(在k8s-worker01,k8s-worker02执行)

#k8s-worker01: [root@k8s-worker01 ~]# kubeadm join 10.10.20.10:6443 --token k4mb93.ur06ejhmuohagd64 \ --discovery-token-ca-cert-hash sha256:38f126c56e9b22e3e75aa9e9aed7bc23b2954c191853d095b94581867dd2269a \ --cri-socket unix:///var/run/cri-dockerd.sock .....(略) 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. #提示可以用kubectl get nodes命令查看集群节点 #k8s-worker02 [root@k8s-worker02 ~]# kubeadm join 10.10.20.10:6443 --token k4mb93.ur06ejhmuohagd64 \ --discovery-token-ca-cert-hash sha256:38f126c56e9b22e3e75aa9e9aed7bc23b2954c191853d095b94581867dd2269a \ --cri-socket unix:///var/run/cri-dockerd.sock .......(略)

6|5回到主节点上查看(仅在k8s-master上执行)

[root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 14m v1.27.3 k8s-worker01 NotReady <none> 5m1s v1.27.3 k8s-worker02 NotReady <none> 2m5s v1.27.3

6|6Calico安装

安装参考网址:https://projectcalico.docs.tigera.io/about/about-calico

1,安装Tigera Calico操作员和自定义资源定义

[root@k8s-master ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml

2,通过创建必要的自定义资源来安装Calico

[root@k8s-master ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml

3,使用以下命令确认所有pod都在运行

[root@k8s-master ~]# watch kubectl get pods -n calico-system

image-20230707100022567

4,验证集群中master节点的可用性

[root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 16m v1.27.3 k8s-worker01 Ready <none> 14m v1.27.3 k8s-worker02 Ready <none> 12m v1.27.3

5,查看集群健康情况,理想状态

[root@k8s-master ~]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR controller-manager Healthy ok etcd-0 Healthy {"health":"true","reason":""} scheduler Healthy ok

6,查看kubernetes集群pod运⾏情况

[root@k8s-master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7bdc4cb885-l7s8f 1/1 Running 0 43m coredns-7bdc4cb885-m8pv7 1/1 Running 0 43m etcd-k8s-master 1/1 Running 0 44m kube-apiserver-k8s-master 1/1 Running 0 44m kube-controller-manager-k8s-master 1/1 Running 0 44m kube-proxy-8pb8p 1/1 Running 0 40m kube-proxy-gffmf 1/1 Running 0 41m kube-proxy-r66c2 1/1 Running 0 43m kube-scheduler-k8s-master 1/1 Running 0 44m

7,再次查看calico-system命名空间中pod运⾏情况

[root@k8s-master ~]# kubectl get pod -n calico-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-56885cd574-hg2tr 1/1 Running 0 36m calico-node-9rvh7 1/1 Running 0 36m calico-node-vsrsm 1/1 Running 0 36m calico-node-xqwv2 1/1 Running 0 36m calico-typha-7f8f84db9b-5n678 1/1 Running 0 36m calico-typha-7f8f84db9b-rfrm4 1/1 Running 0 36m csi-node-driver-m4r7w 2/2 Running 0 36m csi-node-driver-s8z25 2/2 Running 0 36m csi-node-driver-sgs6k 2/2 Running 0 36m

7|0部署nginx网页测试

# 创建Nginx程序 [root@k8s-master ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created #上述命令执行结果 # 开放80端口 [root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed #上述命令执行结果 # 查看pod状态 [root@k8s-master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-77b4fdf86c-cq4jx 1/1 Running 0 105s # 下载choujiang项目 [root@k8s-master ~]# wget https://files.cnblogs.com/files/simuhunluo/choujiang.zip # 解压拷贝到Nginx站点目录 [root@k8s-master ~]# yum -y install unzip [root@k8s-master ~]# mkdir choujiang [root@k8s-master ~]# unzip choujiang.zip choujiang [root@k8s-master ~]# kubectl cp choujiang nginx-77b4fdf86c-cq4jx:/usr/share/nginx/html # 进入容器执行操作 [root@k8s-master ~]# kubectl exec -it nginx-77b4fdf86c-cq4jx /bin/bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@nginx-77b4fdf86c-cq4jx:/# cd /usr/share/nginx/html/ root@nginx-77b4fdf86c-cq4jx:/usr/share/nginx/html# mv choujiang/* . root@nginx-77b4fdf86c-cq4jx:/usr/share/nginx/html# ls root@nginx-77b4fdf86c-cq4jx:/usr/share/nginx/html# exit #查看service状态 [root@k8s-master ~]# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d nginx NodePort 10.98.32.200 <none> 80:31382/TCP 17m # 访问网页:http://10.10.20.10:31382

8|0Dashboard界面

摘要:Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,也可以创建或者修改 Kubernetes 资源 (如 Deployment,Job,DaemonSet 等等)。 例如,你可以对 Deployment 实现弹性伸缩、发起滚动升级、重启 Pod 或者使用向导创建新的应用。Dashboard 同时展示了 Kubernetes 集群中的资源状态信息和所有报错信息

听雨本次只讲安装配置,至于操作,哎呀自己慢慢玩 😘

8|1下载yaml文件

#先创一个文件夹 [root@k8s-master ~]# mkdir dashboard [root@k8s-master ~]# cd dashboard/ [root@k8s-master dashboard]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

8|2修改yaml文件

由于未指定Service的type,而它默认的type是ClusterIP,这会导致它无法被外界所访问,因此要在Service那一栏下面指定type为NodePort,命令查看:kubectl explain Service.spec.type

[root@k8s-master dashboard]# vi recommended.yaml kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 443 targetPort: 8443 selector: k8s-app: kubernetes-dashboard type: NodePort #添加这一行,注意缩进对齐

8|3执行

[root@k8s-master dashboard]# kubectl apply -f recommended.yaml #以下是执行结果 namespace/kubernetes-dashboard created serviceaccount/kubernetes-dashboard created service/kubernetes-dashboard created secret/kubernetes-dashboard-certs created secret/kubernetes-dashboard-csrf created secret/kubernetes-dashboard-key-holder created configmap/kubernetes-dashboard-settings created role.rbac.authorization.k8s.io/kubernetes-dashboard created clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created deployment.apps/kubernetes-dashboard created service/dashboard-metrics-scraper created deployment.apps/dashboard-metrics-scraper created

8|4查看pod和svc

[root@k8s-master dashboard]# kubectl get pod,svc -o wide -n kubernetes-dashboard NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod/dashboard-metrics-scraper-5cb4f4bb9c-jjvb9 1/1 Running 0 82s 192.168.79.74 k8s-worker01 <none> <none> pod/kubernetes-dashboard-6967859bff-5w4k7 1/1 Running 0 83s 192.168.79.75 k8s-worker01 <none> <none> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR service/dashboard-metrics-scraper ClusterIP 10.98.92.117 <none> 8000/TCP 84s k8s-app=dashboard-metrics-scraper service/kubernetes-dashboard NodePort 10.98.195.227 <none> 443:30764/TCP 86s k8s-app=kubernetes-dashboard #dashboard暴露了一个端口号30764,使用https://10.10.20.10:30764访问

image-20230713160407278

8|5创建服务帐户和ClusterRoleBinding

[root@k8s-master dashboard]# vi dashboard-adminuser.yaml #写入如下,创建了一个admin-user的服务账户并与集群绑定 apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard #执行 [root@k8s-master dashboard]# kubectl apply -f dashboard-adminuser.yaml #以下是执行结果 serviceaccount/admin-user created clusterrolebinding.rbac.authorization.k8s.io/admin-user created

8|6获取令牌

[root@k8s-master dashboard]# kubectl -n kubernetes-dashboard create token admin-user #理论会出现以下内容,每个人不一样 eyJhbGciOiJSUzI1NiIsImtpZCI6IjFmZWZRdExiT0pkaTMxaTFtdzVOU2JIQW5veW9vUmFvSEJ0SkJfSFY4MlEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjg5MjM4MDc4LCJpYXQiOjE2ODkyMzQ0NzgsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiNTljM2YwZDktZjRjYS00Y2ZiLWFlOWMtYzA1ZTk5OGRiMTM4In19LCJuYmYiOjE2ODkyMzQ0NzgsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.QJ4S8NCgraJ9rqe7nvcKgxCoh02WJtusXW1xyDqMF6bEenmYxbrORpGIFGjElcPVkY3vkTYsNN2tVTJPRVHQ4Nq-rqQ-KhGlInD-x13B_mjMkn9Bm1-xA4i6zYA_EC2yEkpoL6TFLInL8PG_4lrzKF-7T5aNkJy7lnHQUbv6-w-SFhhrAhvRJA8ZoIy5bNtwKVoaLXtHkqrxSUqztjYaGNwaeO5aqswdKGHJDL3l6dDkI6ETrk4SVfJsj4pPy1IOtijJR8JsZWCeSdPxO6o8zbKVkA1c5pIPuxIwQuLxk6HrzJnm29mXUVz1VT2BZieIS5nMuKpqdY4TkO_T3DWokQ

8|7将生成的token输入即可进入Dashboard管理界面

image-20230713161117045

image-20230713161134189

8|8清理,删除管理员ServiceAccount和集群角色绑定

kubectl -n kubernetes-dashboard delete serviceaccount admin-user kubectl -n kubernetes-dashboard delete clusterrolebinding admin-user

8|9关于查询token

说明:在以前的版本中,可以通过类似于kubectl get secret -n kubernetes-dashboard | grep token | grep admin的命令先查询secret,再使用kubectl describe secret <上条命令查询的结果> -n kubernetes-dashboard即可显示token信息,但现如今版本(我也不知道从哪个版本开始的)这种方式查看无效,并且kubectl get secret -n kubernetes-dashboard也不会显示,所以这里建议生成了token就创建一个文件复制到里面保存下来,如:

[root@k8s-master ~]# cd dashboard/ [root@k8s-master dashboard]# vi admin-user.token #将token复制到admin-user.token文件里保存

查询操作有待研究,各位若是知道查询方法,欢迎在评论留言,感谢各位看官老爷!!😋

9|0K8s资源管理方式介绍

kubernetes的本质是⼀个集群系统,用户可以在集群中部署各种服务,每个服务存在于集群各个容器中,而在kubernetes中,所有内容都被抽象为资源对象,以下命令查看所有资源:

[root@k8s-master ~]# kubectl api-resources

9|1K8s资源类型介绍

资源名称 缩写 资源作用
nodes no 集群组成部分
namespaces ns 资源隔离(隔离pod)
pods po,pod 装载容器
replicationcontrollers rc 控制pod资源
replicasets rs 控制pod资源
deployments deploy 控制pod资源
daemonsets ds 控制pod资源
jobs 控制pod资源
cronjobs cj 控制pod资源
horizontalpodautoscalers hpa 控制pod资源
statefulsets sts 控制pod资源
services svc 统一pod对外接口
ingress ing 统一pod对外接口
volumeattachments 存储资源
persistentvolumes pv 存储资源
persistentvolumeclaims pvc 存储资源
configmaps cm 配置资源
secrets 配置资源

9|2集群管理方式介绍

  • 直接使用kubectl命令去管理k8s集群
[root@k8s-master ~]# kubectl run nginx-pod --image=nginx:latest --port=80
  • 将配置写入到yaml文件,通过文件去管理k8s集群
[root@k8s-master ~]# kubectl create -f nginx-pod.yaml # 或者这样创建,然后往里面写配置 [root@k8s-master ~]# kubectl patch -f nginx-pod.yaml

9|3kubectl命令介绍

kubectl是kubernetes集群的命令行工具,通过它能过够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署,可通过--help获取命令帮助:

[root@k8s-master ~]# kubectl --help

kubectl常用命令如下:

命令 作用
create 创建⼀个资源
edit 编辑⼀个资源
get 获取⼀个资源
patch 更新⼀个资源
delete 删除⼀个资源
explain 展示资源文档
run 在集群中运行⼀个指定的镜像
expose 暴露资源为service
descibe 显示资源内部信息
logs 输出容器在pod中的日志
attach 进⼊运行中的容器
exec 执行容器中的一个命令
cp 在pod内外复制⽂件
rollout 管理资源的发布
scale 扩(缩)容pod的数量
autoscale 自动调整pod的数量
apply 通过文件对资源进行配置
label 更新资源上的标签
cluster-info 显示集群信息
version 显示当前Server和Client版本信息

格式:kubectl [command] [type] [name] [flags]

  • command:指定要对资源执行的操作,例如:create、get、delete
  • type:指定资源类型,例如:deployment、pod、service
  • name:指定资源名称,名称区分大小写
  • flags:指定额外的可选参数

9|4kubectl命令练习

资源名称 缩写 资源作用
pods po,pod 装载容器
# 查看所有pod [root@k8s-master ~]# kubectl get pod # 查看指定的pod(根据pod名字查找) [root@k8s-master ~]# kubectl get pod nginx-77b4fdf86c-cq4jx # 查看指定pod,通过额外参数显示pod详细信息,包括pod的IP地址,pod运⾏的节点等 [root@k8s-master ~]# kubectl get pod nginx-77b4fdf86c-cq4jx -o wide # 查看指定pod,通过额外参数显示pod信息,以json格式显示 [root@k8s-master ~]# kubectl get pod nginx-77b4fdf86c-cq4jx -o json # 查看指定pod,通过额外参数显示pod信息,以yaml格式显示 [root@k8s-master ~]# kubectl get pod nginx-77b4fdf86c-cq4jx -o yaml # 显示指定pod资源内部信息 [root@k8s-master ~]# kubectl describe pod nginx-77b4fdf86c-cq4jx # 显示当前Server和Client版本信息 [root@k8s-master ~]# kubectl version # 显示集群信息 [root@k8s-master ~]# kubectl cluster-info

9|5kubectl命令补齐

# master节点配置 [root@k8s-master ~]# yum install -y bash-completion [root@k8s-master ~]# source /usr/share/bash-completion/bash_completion [root@k8s-master ~]# source <(kubectl completion bash) [root@k8s-master ~]# kubectl completion bash > ~/.kube/completion.bash.inc [root@k8s-master ~]# source '/root/.kube/completion.bash.inc' [root@k8s-master ~]# source $HOME/.bash_profile

听雨:如果在其他node节点需要使用kubectl命令需要先执行以下操作 ↓,再执行上述操作

# 将master节点上的.kube⽬录复制到node节点上,该⽬录在root⽤户家⽬录下,以k8s-worker01为例 [root@k8s-master ~]# scp -r /root/.kube k8s-worker01:/root #拷贝完成后执行上面与master节点一样的配置

k8s-worker01测试命令补全是否可用

[root@k8s-worker01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 26d v1.27.3 k8s-worker01 Ready <none> 26d v1.27.3 k8s-worker02 Ready <none> 26d v1.27.3

10|0未完待续

部署仍在进行中.....


__EOF__

本文作者SkyRainmom
本文链接https://www.cnblogs.com/skyrainmom/p/17517594.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   SkyRainmom  阅读(687)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示