Kubernetes集群 v1.27.3

生产级别的容器编排系统

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 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

基础环境

三个节点均需操作,以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

主机名配置与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

SSH-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

IP路由转发开启,转发 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

配置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

配置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

关闭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

验证基础配置

#验证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)

Docker

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

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

安装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/

配置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"

}

配置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"
}

配置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

启动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

查看版本和信息

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

cri-docker

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

安装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/

配置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

启动cri-docker服务

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

查看cri-docker状态

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

kubelet,kubeadm,kubectl

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

介绍:

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

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

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

安装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    

设置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

kubeadm初始化

查看版本

[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 
........(略)

初始化开始(仅在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节点加入到集群中

根据初始化指示,创建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

Worker节点加入集群(在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

.......(略)

回到主节点上查看(仅在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

Calico安装

安装参考网址: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

部署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

Dashboard界面

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

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

下载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

修改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				#添加这一行,注意缩进对齐

执行

[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

查看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

创建服务帐户和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

获取令牌

[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

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

image-20230713161117045

image-20230713161134189

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

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

关于查询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文件里保存

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

K8s资源管理方式介绍

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

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

K8s资源类型介绍

资源名称 缩写 资源作用
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 配置资源

集群管理方式介绍

  • 直接使用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

kubectl命令介绍

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:指定额外的可选参数

kubectl命令练习

资源名称 缩写 资源作用
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

kubectl命令补齐

# 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

未完待续

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

posted @ 2023-06-30 18:29  SkyRainmom  阅读(547)  评论(0编辑  收藏  举报