2.1 前置知识点
目前生产环境部署Kubernetes 集群主要有两种方式:
1)kubeadm
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm
2)二进制包
从 github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
官方地址:https: / /github.com/kubernetes/kubernetes/releases
两种方式对比
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
kubernetes集群大体上分为两类:一主多从和多主多从。
一主多从:一台Master节点和多台Node节点,搭建简单,但存在单机故障风险,适合用于测试环境;
多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境;
2.2 kubeadm 部署方式介绍
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点 $kubeadm init
- 将Node 节点加入到当前集群中 $kubeadm join <Master 节点的IP 和端口>
2.3 安装要求
在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 CentOS 7.9
- 硬件配置:2GB内存或更多,2 个CPU或更多,硬盘30GB或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap分区
2.4 最终目标
- 在所有节点上安装Docker 和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署Kubernetes Node,将节点加入Kubernetes 集群中
- 部署Dashboard Web 页面,可视化查看Kubernetes 资源
2.5 准备环境
角色 | 配置 | IP地址 | 软件 |
---|---|---|---|
k8s-master | 2C 2G | 192.168.10.131 | docker,kubectl,kubeadm,kubelet |
k8s-node01 | 2C 2G | 192.168.10.132 | docker,kubectl,kubeadm,kubelet |
k8s-node02 | 2C 2G | 192.168.10.133 | docker,kubectl,kubeadm,kubelet |
2.6 所有节点系统初始化
2.6.1 升级操作系统内核
- Linux 3.10 内核在k8s大规模集群中具有不稳定性,因此需要内核升级到 4.19+ 版本以上。
- 此步骤可省略
# 查看内核版本
uname -r
3.10.0-1160.el7.x86_64
# 下载内核软件包
wget -c http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-6.5.5-1.el7.elrepo.x86_64.rpm
wget -c http://193.49.22.109/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-6.5.5-1.el7.elrepo.x86_64.rpm
# 安装内核软件包
yum localinstall -y kernel-ml*
# 查看系统中已安装的内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
# 设置grub2默认引导加载程序,用于启动操作系统
grub2-set-default 0
# 重新生成grub引导文件
grub2-mkconfig -o /boot/grub2/grub.cfg
# 重启系统
reboot
# 查看内核版本
uname -r
6.5.5-1.el7.elrepo.x86_64
2.6.2 设置系统主机名以及Hosts 文件
hostnamectl set-hostname k8s-master && bash
hostnamectl set-hostname k8s-node01 && bash
hostnamectl set-hostname k8s-node02 && bash
cat >>/etc/hosts<<EOF
192.168.10.131 k8s-master
192.168.10.132 k8s-node01
192.168.10.133 k8s-node02
EOF
2.6.3 安装常用软件包
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache
yum -y install vim lrzsz unzip wget net-tools tree bash-completion \
conntrack ntpdate ntp ipvsadm ipset iptables \
curl sysstat libseccomp git psmisc telnet unzip gcc gcc-c++ make
2.6.4 关闭防火墙和内核安全机制
systemctl disable firewalld --now
sed -i 's/enforcing/disabled/g' /etc/selinux/config
setenforce 0
2.6.5 关闭swap分区
- 启用swap分区会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap分区
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab
2.6.6 关闭NetworkManager
systemctl stop NetworkManager
systemctl disable NetworkManager
2.6.7 调整系统内核参数
cat >/etc/sysctl.d/kubernetes.conf<<EOF
# 开启Linux内核的网络桥接功能,同时启用iptables和ip6tables的网络包过滤功能,用于在网络桥接时进行网络包过滤
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 开启路由转发
net.ipv4.ip_forward=1
# 尽可能避免使用交换分区,提升k8s性能
vm.swappiness=0
# 不检查物理内存是否够用
vm.overcommit_memory=1
EOF
# 立即生效
sysctl --system
2.6.8 调整Linux资源限制
- 此步骤可省略
# 设置一个进程可以打开的最大文件句柄数
ulimit -SHn 65535
# 在Linux系统中,默认情况下一个进程可以打开的最大文件句柄数是1024
cat >> /etc/security/limits.conf <<EOF
# 为所有用户设置文件描述符软限制
* soft nofile 655360
# 为所有用户设置文件描述符硬限制
* hard nofile 131072
# 为所有用户设置进程数软限制
* soft nproc 655350
# 为所有用户设置进程数硬限制
* hard nproc 655350
# 为所有用户设置内存锁定软限制为无限制
* soft memlock unlimited
# 为所有用户设置内存锁定硬限制为无限制
* hard memlock unlimited
EOF
2.6.9 配置时间同步
yum -y install chrony
systemctl restart chronyd
chronyc sources -v
hwclock -s #将硬件时钟的时间同步到系统时钟
2.6.10 配置ipvs功能
kube-proxy是k8s工作节点上的一个网络代理组件,它的作用是将发往service的流量负载均衡到正确的后端pod。kube-proxy监听API server中的service和endpoint的变化,并通过iptables或者IPVS创建不同的路由规则,以实现上述目的。
kube-proxy有三种代理方式:
1、userspace模式:最早的代理模式。在UserSpace模式下,kube-proxy会在每个节点上创建一个监听指定端口的用户空间进程,该进程负责接收外部流量并将其转发到相应的Service和Pod。在 k8s v1.2 版本后就已经被淘汰了。
缺点:性能较差,因为每个流量都需要经过用户空间进程的处理,导致较高的延迟和资源消耗。
2、iptables代理模式:k8s v1.12版本之前的默认模式。该模式完全利用内核iptables来实现service的代理和负载均衡。在当前模式下,kube-proxy监听service和endpoint的变化,当service创建时,kube-proxy在iptables中追加新的iptables规则,对于service中的每一个endpoint,会在iptables中追加一条DNAT规则,将目的地址设置为真正提供服务的pod地址;再为service追加规则,设定动作为跳转到对应的endpoint规则上。
该模式下kube-proxy不承担四层负责均衡器的角色,只负责创建iptables规则。该模式的优点是较userspace模式效率更高,但不能提供灵活的LB策略,当后端Pod不可用时也无法进行重试。在部署服务多的时候会产生大量的iptables规则。
3、ipvs代理模式:k8s v1.12版本之后的默认模式。与iptables类似,在内核实现,基于netfilter,监控service、pod的变化并创建对应的ipvs规则,当service变化时,只需要更新ipset记录,不需要改变iptables规则链,因此可以保证iptables中的规则不会根据service的创建越来越多。同时,ipvs模式是一种高性能的负载均衡技术,具有更好的性能和可扩展性,能够处理更高的流量负载。
两者比较的话,ipvs 和 iptables 都是基于netfilter实现的。但ipvs的性能明显要高一些,如果要使用它,需要手动启动ipvs模块。
# 安装工具包
yum -y install ipvsadm ipset sysstat conntrack libseccomp
# 添加ipvs模块和内核模块
cat >>/etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4 #内核4.19以上版本设置为nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
overlay
br_netfilter
EOF
# 重启服务
systemctl restart systemd-modules-load
# 查看内核模块
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 注意:
Linux内核4.19+版本已经将nf_conntrack_ipv4更新为nf_conntrack。
nf_conntrack是Linux内核中用于连接跟踪的模块,它负责跟踪网络连接的状态,包括连接的建立、维护和终止,以及相关的网络数据包的处理。这个模块在防火墙、网络地址转换(NAT)、负载均衡等网络功能中起着重要作用。
2.6.11 安装Docker软件
k8s是一个开源的容器编排和管理平台,而Docker是一个流行的容器引擎。Kubernetes默认CRI(容器运行时)为Docker,因此需要先安装Docker。
注意:k8s v1.24 版本以后放弃了 Docker 作为容器进行时,而采用containerd容器进行时。
下面是一些常见的k8s版本和docker版本的兼容性规则:
k8s v1.22.x 版本需要 Docker 20.10.x 或更高版本。
k8s v1.21.x 版本需要 Docker 20.10.x 或更高版本。
k8s v1.20.x 版本需要 Docker 19.03.x 或更高版本。
k8s v1.19.x 版本需要 Docker 19.03.x 或更高版本。
k8s v1.18.x 版本需要 Docker 19.03.x 或更高版本。
查看k8s v1.18版本对应的docker支持的最新版本
https://github.com/kubernetes/kubernetes/blob/release-1.18/build/dependencies.yaml
查看最新版本k8s对应的docker支持的最新版本
https://github.com/kubernetes/kubernetes/blob/master/build/dependencies.yaml
# 安装依赖的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加docker软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
# 查看所有docker版本
yum list docker-ce --showduplicates |sort -r
# 安装指定版本docker
yum -y install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io
# 默认安装最新版本docker(省略)
yum install -y docker-ce docker-ce-cli containerd.io
# 创建目录
mkdir /etc/docker
# 配置docker加速并修改驱动
# k8s官方建议docker cgroup驱动采用systemd,设置systemd对容器资源限制,生产环境建议修改,因为更稳定。
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"], ##设置Docker cgroup的驱动程序
"registry-mirrors": ["https://docker.1panel.dev","https://docker.1ms.run"], ##镜像加速器地址
"log-driver": "json-file", ##默认的日志驱动程序
"log-opts": {"max-size": "100m"}, ##容器日志文件大小上限为100M
"storage-driver": "overlay2" ##默认的文件存储引擎
}
# 重启docker服务
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
2.6.12 安装Kubeadm工具
# 添加k8s软件源
cat <<EOF>/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache fast
# 查看k8s软件包版本
yum list kubeadm --showduplicates | sort -r
# 默认安装最新版本k8s(省略)
yum install -y kubelet kubeadm kubectl && systemctl enable kubelet
# 安装指定版本k8s
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
# kubelet使用systemd来作为cgroup驱动,使系统运行稳定,限制Pod和容器的资源使用情况,如cpu、内存等。
# 注意:k8s v1.22开始,使用 kubeadm 创建集群时,默认使用systemd为cgroup驱动程序;
# 注意:kubelet中的cgroup与docker中的cgroup保持一致;
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
EOF
# kubelet设置为开机自启动
systemctl daemon-reload
systemctl enable kubelet
# 各工具包作用
kubeadm:快速部署kubernetes集群的工具
kubelet:负责集群中的每个节点上启动Pod和容器的工具
kubectl:负责管理kubernetes集群的命令行工具
# 查看k8s版本
kubelet --version 或 kubeadm version
# 查看kubelet日志
journalctl -xefu kubelet
2.7 主节点部署Kubernetes
2.7.1 初始化集群
k8s 各版本信息:https://github.com/kubernetes/kubernetes/tree/master/CHANGELOG
# 查看k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images list --kubernetes-version=v1.23.0 \
--image-repository=registry.aliyuncs.com/google_containers
# 下载k8s集群所需要的镜像
[root@k8s-master ~]# kubeadm config images pull --kubernetes-version=v1.23.0 \
--image-repository=registry.aliyuncs.com/google_containers
方法一:初始化集群手动开启IPVS
[root@k8s-master ~]# kubeadm init \
--apiserver-advertise-address=192.168.10.131 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--upload-certs | tee kubeadm-init.log
# 参数解释:
--apiserver-advertise-address 集群通告地址
--image-repository 指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与软件包版本一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr Pod网络的范围,与下面部署的CNI网络组件yaml中保持一致(可以修改)
--upload-certs 将控制节点的证书上传到kubeadm-certs Secret中,可添加多个控制节点
方法二:初始化集群自动开启IPVS
# 创建初始化集群配置文件
[root@k8s-master ~]# kubeadm config print init-defaults > kubeadm-init.yaml
# 修改初始化集群配置文件
[root@k8s-master ~]# vim kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.10.131 #修改master节点IP地址
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master #修改master节点主机名
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #修改阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: v1.23.0 #修改k8s版本号
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 #添加Pod网段
scheduler: {}
# 末尾添加
--- #更改kube-proxy的代理模式,默认为iptables
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
--- #更改kubelet cgroup驱动为systemd
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
# 初始化集群
[root@k8s-master ~]# kubeadm init --config=kubeadm-init.yaml --upload-certs | tee kubeadm-init.log
# 查看 kube-proxy 代理模式
curl localhost:10249/proxyMode
# 注意:k8s集群初始化失败,查看日志解决
journalctl -xeu kubelet 或 tail kubeadm-init.log
重置初始化node节点(省略)
[root@k8s-node01 ~]# kubeadm reset
[root@k8s-node01 ~]# rm -rf /etc/kubernetes/*
重置初始化master节点(省略)
[root@k8s-master ~]# kubeadm reset
[root@k8s-master ~]# rm -rf ~/.kube/
[root@k8s-master ~]# rm -rf /etc/kubernetes/*
[root@k8s-master ~]# rm -rf /var/lib/etcd/*
2.7.2 配置kubectl工具
- Kubectl 是一个用于操作Kubernetes集群的命令行工具。
- kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 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
# 临时生效(退出当前窗口重连环境变量失效)
[root@k8s-master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
# 永久生效(推荐)
[root@k8s-master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@k8s-master ~]# source ~/.bash_profile
# 在Kubernetes集群中,admin.conf 文件是用于配置kubectl工具访问Kubernetes集群的客户端配置文件。该文件包含了连接到Kubernetes集群所需的认证信息、集群信息和上下文信息。
2.7.3 查看master组件状态
[root@k8s-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
# /etc/kubernetes/manifests/目录是用于存放Kubernetes集群中各个组件的Pod配置文件。通常会包含以下几个重要的配置文件:
etcd.yaml:用于部署和管理etcd集群的配置文件
kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件
# 当Kubernetes集群启动时,kubelet会自动监视/etc/kubernetes/manifests/目录下的配置文件,并根据这些配置文件创建和管理对应的Pod。
# 除了kubelet之外,其它组件是通过pod的方式运行,配置文件在/etc/kubernetes/manifests 内,修改该配置文件后会动态生效。
# kube-apiserver两个端口:
8080:非安全端口,不需要认证,没有加入认证机制。kubectl默认先连接8080,如果配置了kubeconfig,就连接6443端口。kubeadm方式默认关闭了8080端口,二进制默认启用了。
6443:安全端口,提供了内部授权的机制。
2.7.4 工作节点加入集群
[root@k8s-node01 ~]# kubeadm join 192.168.10.131:6443 --token h0uelc.l46qp29nxscke7f7 \ ##token值
--discovery-token-ca-cert-hash \
sha256:abc807778e24bff73362ceeb783cc7f6feec96f20b4fd707c3f8e8312294e28f ##token的hash值
# 端口号6443:通常用于Kubernetes集群的API接口,提供对集群的管理和控制。
# 在使用kubeadm部署Kubernetes集群时,证书通常存放在以下默认路径中:
CA 证书:通常存放在 /etc/kubernetes/pki 目录下,包括用于签发各种证书的 CA 证书和密钥。
服务端证书和密钥:存放在 /etc/kubernetes/pki 目录下,包括用于apiserver、Controller Manager、Scheduler等组件的证书和密钥。
客户端证书和密钥:存放在 /etc/kubernetes/pki 目录下,包括用于kubelet、kube-proxy 等组件的证书和密钥。
1)master查看令牌token
[root@k8s-master ~]# kubeadm token list
2)master查看证书cert
[root@k8s-master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
3)master生成token和hash值
- 默认token有效期为24小时,当过期之后,该token就不可用了。使用 --ttl 0 可以生成一个永不过期的 token。
[root@k8s-master ~]# kubeadm token create --print-join-command --ttl 0
4)master生成证书和私钥
- master生成证书和私钥,供其他master节点加入集群
[root@k8s-master ~]# kubeadm init phase upload-certs --upload-certs
2.7.5 查看集群节点状态
- 此时,k8s内部不具备网络功能,因此节点信息都是 “Not Ready” 状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 5m22s v1.23.0
k8s-node01 NotReady <none> 3m26s v1.23.0
k8s-node02 NotReady <none> 6s v1.23.0
2.7.6 部署网络CNI组件
kubernetes集群的网络是比较复杂的,不是集群内部实现的,为了更方便的使用集群,因此,使用第三方的cni网络插件(Container Network Interface )。cni是容器网络接口,作用是实现容器跨主机网络通信。pod
的ip地址段,也称为cidr
。
-
kubernetes支持多种网络插件,比如flannel、calico、canal等,任选一种即可。生产环境一般选择calico。
-
Flannel 是一个轻量级的网络插件,基于虚拟网络的方式,使用了多种后端模式实现网络连接,如基于 Overlay 的 VXLAN 和基于 Host-Gateway 的模式。它创建了一个覆盖整个集群的虚拟网络,使得 Pod 可以跨节点通信。通常用于中小规模集群。
-
Calico 是一个功能强大的网络插件,不仅提供高性能的网络通信,还支持网络策略、负载均衡和安全控制。通常用于大规模集群。
-
calico.yaml文件每个版本都有区别的,需要满足对应的k8s 版本
参考:https://archive-os-3-25.netlify.app/calico/3.25/getting-started/kubernetes/requirements
calico 3.25 版本支持的K8S版本有v1.23—v1.28官方下载地址:https://docs.tigera.io/calico
Github访问地址:https://github.com/projectcalico/calico
# 下载Calico文件
[root@k8s-master ~]#
wget https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml --no-check-certificate
# 修改Calico文件
[root@k8s-master ~]# vim calico.yaml
# 找到4601行,去掉注释并修改
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# 部署Calico
[root@k8s-master ~]# kubectl apply -f calico.yaml
2.7.7 查看所有pod运行情况
[root@k8s-master ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-658d97c59c-qmqt9 1/1 Running 0 5m3s
kube-system calico-node-2m8d4 1/1 Running 0 5m3s
kube-system calico-node-5lxtr 1/1 Running 0 5m3s
kube-system calico-node-vxpmq 1/1 Running 0 5m3s
kube-system coredns-66f779496c-7mhwx 1/1 Running 0 8m38s
kube-system coredns-66f779496c-s92nz 1/1 Running 0 8m38s
kube-system etcd-k8s-master 1/1 Running 0 8m53s
kube-system kube-apiserver-k8s-master 1/1 Running 0 8m52s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 8m52s
kube-system kube-proxy-f52mk 1/1 Running 0 8m39s
kube-system kube-proxy-fbz94 1/1 Running 0 7m42s
kube-system kube-proxy-z9wr7 1/1 Running 0 7m30s
kube-system kube-scheduler-k8s-master 1/1 Running 0 8m53s
# /etc/kubernetes/manifests/目录下存放Kubernetes集群中各个组件的Pod配置文件。
# 通常会包含以下几个重要的配置文件:
etcd.yaml:用于部署和管理etcd集群的配置文件
kube-apiserver.yaml:用于部署和管理Kubernetes API服务器的配置文件
kube-controller-manager.yaml:用于部署和管理Kubernetes控制器管理器的配置文件
kube-scheduler.yaml:用于部署和管理Kubernetes调度器的配置文件
# 当Kubernetes集群启动时,kubelet会自动监视/etc/kubernetes/manifests/目录下的配置文件,并根据这些配置文件创建和管理对应的Pod。
# ca证书默认存放在/etc/kubernetes/pki/目录下
2.7.8 查看集群节点状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 2m v1.23.0
k8s-node01 Ready <none> 30m v1.23.0
k8s-node02 Ready <none> 27m v1.23.0
3.3 主节点安装kubectl命令自动补全
1)安装bash-completion工具
[root@k8s-master ~]# yum install bash-completion -y
2)执行bash_completion
[root@k8s-master ~]# source /usr/share/bash-completion/bash_completion
3)加载kubectl completion
# 在当前bash环境中永久设置命令补全
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source ~/.bashrc
3.4 主节点测试kubernetes集群
部署nginx服务
# 创建应用服务nginx
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx --replicas=3
# 暴露nginx服务
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
# 查看pod和service信息
# 默认情况下,master节点存在污点,不接受任何pod资源调度!!!
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-7854ff8877-pgm56 1/1 Running 0 13m
pod/nginx-7854ff8877-psmtc 1/1 Running 0 13m
pod/nginx-7854ff8877-s6lkd 1/1 Running 0 13m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40m
service/nginx NodePort 10.107.70.6 <none> 80:32115/TCP 23m
# 查看pod运行的节点
[root@k8s-master ~]# kubectl get pod -n default -o wide
# 测试访问
浏览器输入地址:nodeIP:port 则可以看到nginx测试页面!!!
3.5 主节点部署Dashboard
为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。用户可以使用Dashboard部署容器化的应用,还可以监控应用的状态,执行故障排查以及管理kubernetes中各种资源。
3.5.1 下载yaml文件并运行Dashboard
下载地址:https://github.com/kubernetes/dashboard
dashboard版本与kubernetes版本兼容性:https://github.com/kubernetes/dashboard/releases
# 若github无法正常访问,修改hosts文件
[root@k8s-master ~]# vim /etc/hosts
199.232.68.133 raw.githubusercontent.com
# 下载yaml文件
[root@k8s-master ~]#
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 修改Service类型
[root@k8s-master ~]# vim recommended.yaml
...................................
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort #39行下方添加
ports:
- port: 443
targetPort: 8443
nodePort: 30009 #新增端口
selector:
k8s-app: kubernetes-dashboard
# 部署服务
[root@k8s-master ~]# kubectl apply -f recommended.yaml
# 查看kubernetes-dashboard名称空间下的所有pod和service资源
[root@k8s-master ~]# kubectl get pod,svc -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
pod/dashboard-metrics-scraper-c79c65bb7-zwfvw 1/1 Running 0 111s
pod/kubernetes-dashboard-56484d4c5-z95z5 1/1 Running 0 111s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dashboard-metrics-scraper ClusterIP 10.96.89.218 <none> 8000/TCP 111s
service/kubernetes-dashboard NodePort 10.104.178.171 <none> 443:30009/TCP 111s
3.5.2 创建访问账户,获取token
Dashboard 支持 Kubeconfig 和 Token 两种认证方式,这里选择Token认证方式登录。
# 创建sa认证账号
[root@k8s-master ~]# vim admin-user.yml
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 ~]# kubectl apply -f admin-user.yml
# 获取账号token
[root@k8s-master ~]# kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6InRTUWZyZ0I0SUR3czBSamt1MzIxY3F1ejRnX3VSVl9qbUZ6S3JtU2paYWMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjk1NzAyMzc1LCJpYXQiOjE2OTU2OTg3NzUsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiYjcyZTYxMTItMjQ2Yi00MWU5LTgzY2ItZWExNmViYzg5ZDcxIn19LCJuYmYiOjE2OTU2OTg3NzUsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.rVM7-tUmDIa4s1oAGm9OxBnh36jLn7WzD3y9v7KCEad3KtqxefuU2rl0_6PV2w9kFBS342CFh00tojX-PX9MrLu_ggmZ_zD3r-liGh9DgQaD8fFOKyBpZAzlDzDTieI3TdqI9HqQ1DAWUGma4pikg_1AfxFzgQbCC-z5-TSynC-PYvdr2gE5IkNAP_oPk7dNL2hnuX5-gmWFih8H5Q32bu3t8zQJ0Wh69mNKRLVPZRTKq6IdIqv6fu0mho0LrOr-q6deQ82cxqbPG0ZEW-sCRY1s2raI8xjGQ7kLfwCDEXFaT_qPbCqmLlBMurBXN-HjzD-g-pf6TgvQTEGtUmBLtg
3.5.3 浏览器访问Dashboard
浏览器输入 https://192.168.10.131:30009 访问Dashboard
在登录页面上输入账号的token值
出现下面的页面代表登录成功
总结:整理不易,如果对你有帮助,请记得点赞,关注,收藏。更多kubernetes相关知识持续分享中。