1.3 Kubernetes集群架构组件
1)Master组件
kube-apiserver
(Kubernetes API)集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
kube-schedule
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
2)Node组件
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket
容器引擎,运行容器
1)Pod
最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的
2)Controller
ReplicaSet:确保预期的Pod副本数量
Deployment:无状态应用部署
StatefulSet:有状态应用部署
DaemonSet:确保所有Node运行同一个Pod
Job:一次性任务
Cronjob:定时任务
3)更高级层次对象,部署和管理Pod
Service:
防止Pod失联;定义一次Pod的访问策略
Service抽象层不过是iptables或者ipvs中的规则而已
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces:命名空间,将对象逻辑上隔离
Annotations:注释
4)网络解决方案
K8S通过CNI插件体系来接入外部网络服务解决方案
常见的有:
flannel:网络配置相关
calico:网络配置、网络策略
canel:flannel的网络配置 + calico的网络策略
5)三种网络
Pod网络:Pod的地址是配置在Pod内部的网络名称空间上的,是能ping通的,就像正常主机上的地址一样
Service网络(集群网络):Service的地址是虚拟的,它只存在于iptables或者ipvs的规则之中
节点网络:各个节点也应该有一个网络
各个Pod运行在同一个网络中,而service是另外一个网络;Pod和service的地址是不同网段的。
接入外部访问时,先接入节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。
同一Pod内的多个容器之间通过 lo 接口进行通信。
两个Pod之间可以直接进行通信:通过隧道的方式(Overlay叠加网络)来转发二层报文,使得它们虽然扩主机但是好像工作在同一个二层网络中。访问对方Pod所在节点的位置,然后再代理到Pod内部的容器上。
########################################
##环境准备,以下在所有机器上操作(1台master,2台node机器):
# 关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
setenforce 0
# 关闭swap
# 临时
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
#允许 iptables 检查桥接流量
cat < /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
在所有的Kubernetes节点执行以下脚本(若内核大于4.19替换nf_conntrack_ipv4为nf_conntrack):
cat > /etc/sysconfig/modules/ipvs.modules <> /etc/hosts << EOF
120.24.61.180 gitlab
120.78.183.238 node1
EOF
#如果机器时区、时间不对进行以下操作
#更改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#安装ntpdate工具
yum -y install ntp ntpdate
#设置系统时间与网络时间同步
ntpdate 0.asia.pool.ntp.org
#将系统时间写入硬件时间
hwclock --systohc
########################################
##安装Docker、Kubernetes
#安装yum-utils
yum install -y yum-utils
#配置docker的yum地址
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装指定版本
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
#查看docker版本
docker --version
#启动&开机启动docker
systemctl enable docker
systemctl start docker
#配置docker的镜像源
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
#加载&重启
systemctl daemon-reload
systemctl restart docker
#配置k8s的yum源地址
cat <> ~/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source ~/.bashrc
#安装Calico网络插件
在master节点上安装即可,其他节点加入k8s集群后会自动安装
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml #如果下载不了就用浏览器访问,复制源码粘贴。记得在calico.yaml文件里的625行处把192.168.0.0/16修改为10.244.0.0/16。
kubectl apply -f calico.yaml
#加入Node节点
#把初始化master节点的最后一句话在node1、node2上执行,如:
kubeadm join k8s-master:6443 --token 3vckmv.lvrl05xpyftbs177 \
--discovery-token-ca-cert-hash sha256:1dc274fed24778f5c284229d9fcba44a5df11efba018f9664cf5e8ff77907240
#默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token
kubeadm token create --print-join-command
#查看所有节点状态
kubectl get nodes
########################################
##安装KubeSphere
#先安装nfs文件系统
#在每个机器执行
yum install -y nfs-utils
#在master执行以下命令
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
#执行以下命令,创建共享目录
mkdir -p /nfs/data
#在master执行
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
#使配置生效
exportfs -r
#检查配置是否生效
exportfs
#如果想同步nfs数据到Node节点,可以在Node节点执行以下命令
showmount -e 192.168.10.11
mkdir -p /nfs/data
mount -t nfs 192.168.10.11:/nfs/data /nfs/data
#配置默认存储
#修改附件sc.yaml里的两处ip为master ip再执行安装
kubectl apply -f sc.yaml
#确认配置是否生效
kubectl get sc
#安装集群指标监控组件 metrics-server
#执行附件metrics.yaml安装
kubectl apply -f metrics.yaml
#开始安装KubeSphere
#执行附件kubesphere-installer.yaml、cluster-configuration.yaml
kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml
#查看安装进度
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
#访问任意机器的 30880端口
账号 : admin
密码 : P@88w0rd
#解决etcd监控证书找不到问题
kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt --from-file=etcd-client.crt=/etc/kubernetes/pki/apiserver-etcd-client.crt --from-file=etcd-client.key=/etc/kubernetes/pki/apiserver-etcd-client.key
########################################
##Kubernetes集群重置初始化
#首先需要在master主机上将node1子节点解除关系(节点node2同理)
kubectl drain ks-n1 --delete-local-data --force --ignore-daemonsets
#再删除node1节点(节点node2同理)
kubectl delete node ks-n1
#再执行重置
kubeadm reset
#再执行以下命令
rm -rf /root/.kube
rm -rf /etc/cni/net.d
iptables -F
#Node节点也要执行重置
kubeadm reset
#再执行以下命令
rm -rf /etc/cni/net.d
iptables -F
#所有机器删除tunl0网络
ifconfig tunl0 down
ip link delete tunl0
#删不掉可以执行以下命令删除
rmmod ipip
#所有机器重启
reboot
#再后就是初始化master节点
kubeadm init ...
########################################
##内核软死锁(soft lockup)bug原因分析
#Soft lockup名称解释:所谓,soft lockup就是说,这个bug没有让系统彻底死机,但是若干个进程(或者kernel thread)被锁死在了某个状态(一般在内核区域),很多情况下这个是由于内核锁的使用的问题。
#修改阈值为30,写入文件
echo 30 > /proc/sys/kernel/watchdog_thresh
#修改阈值为30,临时生效
sysctl -w kernel.watchdog_thresh=30
#修改阈值为30,写入启动文件
echo "kernel.watchdog_thresh=30" >> /etc/sysctl.conf
k8s
的图形化管理工具之 kuboard
wget https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f kuboard.yaml
# 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令# 获取token,为登录kuboard做准备
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)
访问地址:http://192.168.11.130:32567
六:常用命令
重置集群节点命令 kubeadm reset
查询join命令 kubeadm token create --print-join-command
Kubernetes集群信息查看及管理
3.1 Pod的创建与查看
1)信息查看
# 查看k8s集群的整体信息
kubectl cluster-info
# 查看当前系统上已经被创建的控制器
kubectl get deployment
# 查看pod的相关信息
kubectl get pods
kubectl get pods -o wide # 查看更详细的信息
# 查看services的相关信息
kubectl get services
kubectl get svc
# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
2)创建一个pod
# 创建并运行一个特定的镜像,暴露80端口,并且只创建1个副本,干跑模式需要再加上--dry-run=true
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1
# 如果要镜像中运行其他程序,可以写成这样(注意前面要加 -- )
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh
3)对刚刚创建的pod进行查看并访问
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy 1/1 Running 0 3m6s 10.244.1.2 k8s-node01
[root@k8s-master01 ~]# curl 10.244.1.2
3.2 创建pod并暴露端口
在Kubernetes集群中创建一个pod,然后暴露端口,验证其是否可以正常访问
1)创建deployment
# 创建一个deployment控制器,这个控制器的名字就叫nginx-deploy
kubectl create deployment nginx-deploy --image=nginx
2)创建service并暴露端口
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 将nginx-deploy这个控制器(deployment )相关的pod资源都创建为一个服务,服务名叫nginx
# --name 是service的名称
# --port 是service暴露到外部的端口
# --target-port 是pod暴露的端口
# --protocol 使用的协议,默认就是TCP
# --type 是service的类型,service有多种类型,可kubectl expose --help来查看--type选项,Defaultis 'ClusterIP'
3)查看相关信息并访问
# 查看pod和service的相关信息
[root@k8s-master01 ~]# kubectl get pods,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-deploy-8588f9dfb-t8wzr 1/1 Running 0 11m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 78m
service/nginx ClusterIP 10.99.193.184 80/TCP 34s
# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
# 访问:http://NodeIP:PORT,只有在集群内部的节点上才能被访问到
curl http://10.99.193.184
删除节点
设置节点不可调度
#kubectl cordon local-k8s-nd01
驱逐节点上的pod
#kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
删除节点
#kubectl delete node k8s-node1
在需要删除的节点上执行reset,这样该节点即完全从 Cluster 中脱离开来
#kubeadm reset
删除服务
kubectl delete -f calico.yaml
重建服务
kubectl apply -f calico.yaml
重置k8s服务
kubeadm reset