Kubernetes集群 v1.27.3
生产级别的容器编排系统
Kubernetes 介绍
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统,它是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。 Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。 |
传统部署时代:
早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。 |
虚拟化部署时代:
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。 |
容器部署时代:
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。 容器因具有许多优势而变得流行起来,例如:
|
Kubernetes 作用:
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些? Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。 |
Kubernetes 提供:
|
基础环境
三个节点均需操作,以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
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访问
创建服务帐户和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管理界面
清理,删除管理员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
未完待续
部署仍在进行中.....