目录
一、kubernetes集群环境搭建
1.前置知识点
目前生产部署Kubernetes 集群主要有两种方式:kubeadm、二进制包。
- Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
- 从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
我们选择kubeadm方式安装
2.环境准备
- 操作系统centos7.x
- 2核、2G内存,20G硬盘。我的硬盘给的是50G
- docker:18+
- k8s:1.23.6
3.kubeadm方式搭建前置准备
1.克隆虚拟机
我们就直接克隆hadoop当时做的虚拟机,注意,内存需要设置成4核4G:
162.Hadoop(一):Hadoop基本概念,基本环境安装,单机运行,各虚拟机数据同步_本机部署hadoop和虚拟机-CSDN博客
我们变更好ip,以及主机名,我的ip是150,151,152。主机名:kubernete150,kubernete151,kubernete152
后面因为要对每个机器执行一样的指令,我们在xshell中设置一下:
2.初始操作
这些操作在三台机器上都要执行:
# 关闭防火墙
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
# 关闭完swap后,一定要重启一下虚拟机!!!
# 根据规划设置主机名
hostnamectl set-hostname <hostname>
# 在master添加hosts
cat >> /etc/hosts << EOF
192.168.200.140 kubernete140
192.168.200.141 kubernete141
192.168.200.142 kubernete142
EOF
# 将桥接的IPv4流量传递到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
# 时间同步
yum install ntpdate -y
ntpdate time.windows.com
4.安装k8s集群
以下三台机器都要执行:
1.安装docker
#卸载系统之前的 docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
#安装 Docker-CE安装必须的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
#设置 docker repo 的 yum 位置
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 docker,以及 docker-cli
sudo yum -y install docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7
配置 docker 加速
sudo mkdir -p /etc/docker
########################################################################
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
########################################################################
重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
开机自启动
systemctl enable docker
#添加阿里云yum源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.安装k8s组件
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6
systemctl enable kubelet
# 添加一下 Docker 的 cgroups
vim /etc/docker/daemon.json
###################################################
"exec-opts": ["native.cgroupdriver=systemd"]
###################################################
# 重启 docker
systemctl daemon-reload
systemctl restart docker
3.主节点部署k8s master
# 在 Master 节点下执行,需求修改第一个ip为自己主节点ip
kubeadm init \
--apiserver-advertise-address=192.168.200.140 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.6 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 安装成功后,复制如下配置并执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
#做一个永不过期的token
kubeadm token create --ttl 0 --print-join-command
#查看token
kubeadm token list
4.子节点加入主节点
#该指令是在上面主节点init,以及生成永久token的时候自动出现的,复制即可
kubeadm join 192.168.200.140:6443 --token lliapm.aalnxozcungbtv5n --discovery-token-ca-cert-hash sha256:001c143c3959d833f66d74e82fb094bd7bbed3e8e2c6fc3c636405b20a86ed04
5.配置网络
#主机器执行:
cd /opt
mkdir k8s
cd k8s/
curl https://docs.projectcalico.org/v3.18/manifests/calico.yaml -O
#修改配置文件
vim calico.yaml
####################################################################################
#在3672行找到CALICO_IPV4POOL_CIDR,将其name和value放开,并且修改value为10.244.0.0/16
####################################################################################
# 删除镜像 docker.io/ 前缀,避免下载过慢导致失败
sed -i 's#docker.io/##g' calico.yaml
#运行
kubectl apply -f calico.yaml
#查看
kubectl get po -n kube-system
#如果pod一直是不成功,查看原因
kubectl describe po calico-kube-controllers-5d7c98599-vhz76
kubectl describe po calico-kube-controllers-5d7c98599-vhz76 -n kube-system
#查看节点
kubectl get nodes
6.测试k8s集群
# 创建部署
kubectl create deployment nginx --image=nginx
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看 pod 以及服务信息,看到暴露的端口
kubectl get pod,svc
5.在任意节点使用kubectl
我们可以看到,在主节点可以用kubectl,但是在子节点不行
#将主机器的admin.conf复制到两个子机器
/etc/kubernetes/admin.conf
#子机器配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
kubectl get nodes
6.资源类型别名
-
pods:po
-
deployments:deploy
-
services:svc
-
namespace:ns
-
nodes:no
7.格式化输出
-
输出 json 格式:-o json
-
仅打印资源名称:-o name
-
以纯文本格式输出所有信息:-o wide
-
输出 yaml 格式:-o yaml
二、pod深入了解
1.配置文件
##我们先把之前创建的nginx删除
kubectl get pods
kubectl get deploy
kubectl get svc
kubectl delete deploy nginx
kubectl delete svc nginx
#创建对应的目录,yml文件
cd /opt/k8s
mkdir cni
mv calico.yaml cni/
mkdir pods
cd pods/
vim nginx-demo.yaml
apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-demo # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
command: # 指定容器启动时执行的命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
ports:
- name: http # 端口名称
containerPort: 80 # 描述容器内要暴露什么端口
protocol: TCP # 描述该端口是基于哪种协议通信的
env: # 环境变量
name: JVM_OPTS # 环境变量名称
value: '-Xms128m -Xmx128m' # 环境变量的值
resources:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心
memory: 128Mi # 限制内存最少使用 128兆
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
kubectl create -f nginx-demo.yaml
kubectl get pods -o wide
kubectl describe po nginx-demo
2.探针
容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态
(1)探针的类型
-
StartupProbe:他是最先启动的探针,监控应用有没有启动成功。成功后才会启动其他的探针
-
LivenessProbe:用于探测容器中的应用是否在成功运行,如果探测失败,kubelet 会根据配置的重启策略进行重启
-
ReadinessProbe:有时候应用启动好后需要做初始化配置,配置完成后才能提供对外服务。这个探针就是监控初始化有没有完成,如果没有完成,不会对外提供服务
startupProbe:
httpGet:
path: /api/startup
port: 80
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
failureThreshold: 3 # 错误次数
httpGet:
path: /ready
port: 8181
scheme: HTTP
periodSeconds: 10 # 间隔时间
successThreshold: 1
timeoutSeconds: 1
(2)探针探测方式
*1)ExecAction:命令方式
在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。
livenessProbe:
exec:
command:
- cat
- /health
*2)TCPSocketAction:Tcp方式
通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康
livenessProbe:
tcpSocket:
port: 80
*3)HTTPGetAction:HTTP方式
生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。
livenessProbe:
failureThreshold: 5
httpGet:
path: /health
port: 8080
scheme: HTTP
httpHeaders:
- name: xxx
value: xxx
(4)探针的使用
#我们先尝试去修改pod,但是不允许修改,我们就把pod先删掉
kubectl get po
kubectl edit po nginx-demo
kubectl delete po nginx-demo
#yaml添加如下
vim nginx-demo.yaml
########################################################
startupProbe: # 应用启动探针配置
httpGet: # 探针方式,基于HTTP请求探测
path: /index.html # http请求路径
port: 80 # 请求的端口
timeoutSeconds: 5 # 请求的超时时间
periodSeconds: 10 # 监测间隔时间
successThreshold: 1 # 多少次检测成功算成功
failureThreshold: 3 # 失败多少次才算真正失败
########################################################
#启动并查看
kubectl create -f nginx-demo.yaml
kubectl get pods -o wide
kubectl describe po nginx-demo
3.生命周期
(1)整体流程
- 最开始会有一个初始化阶段,该阶段会初始化多个容器
- 初始化完之后,会执行postStart的钩子函数,并且同时会执行command指令。
- 这里有一个问题,我们倾向于认为钩子函数执行好之后再执行command指令,但是很多时候他们的顺序并不是这样的,钩子函数可能会在command之后,因此,一些初始化的东西最好在初始化阶段做完,很少在钩子函数里做
- 执行启动探针,确认是否真的启动好
- 执行就绪探针、存活探针
- 在关闭前还会执行preStop钩子函数
(2)钩子函数应用
所谓钩子函数,就是在服务开始时以及结束前额外的一些操作。
设置生命周期,以及关闭前的处理时长:
cd /opt/k8s/pods/
cp nginx-demo.yaml nginx-prestop-po.yaml
vim nginx-prestop-po.yaml
##########################################
apiVersion: v1 # api 文档版本
kind: Pod # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
name: nginx-prestop # Pod 的名称
labels: # 定义 Pod 的标签
type: app # 自定义 label 标签,名字为 type,值为 app
test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
terminationGracePeriodSeconds: 40 #变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作
containers: # 对于 Pod 中的容器描述
- name: nginx # 容器的名称
image: nginx:1.7.9 # 指定容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
lifecycle: #生命周期配置
postStart: #生命周期启动阶段执行,不一定在command之前执行
exec:
command:
- sh
- -c
- "echo '<h1>post start</h1>' > /usr/share/nginx/html/prestop.html"
preStop:
exec:
command:
- sh
- -c
- "sleep 50; echo 'sleep finish ...' >> /usr/share/nginx/html/prestop.html"
command: # 指定容器启动时执行的命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
ports:
- name: http # 端口名称
containerPort: 80 # 描述容器内要暴露什么端口
protocol: TCP # 描述该端口是基于哪种协议通信的
env: # 环境变量
- name: JVM_OPTS # 环境变量名称
value: '-Xms128m -Xmx128m' # 环境变量的值
resources:
requests: # 最少需要多少资源
cpu: 100m # 限制 cpu 最少使用 0.1 个核心
memory: 128Mi # 限制内存最少使用 128兆
limits: # 最多可以用多少资源
cpu: 200m # 限制 cpu 最多使用 0.2 个核心
memory: 256Mi # 限制 最多使用 256兆
restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
##########################################
#启动
kubectl create -f nginx-prestop-po.yaml
#关闭
time kubectl delete po nginx-prestop
可以看到,不设置关闭时间,默认30秒,设置了就是40秒:
三、资源调度
1.Label和Selector
#先启动上面的pod
cd /opt/k8s/pods
kubectl create -f nginx-prestop-po.yaml
#查看标签
kubectl get po --show-labels
#临时添加标签
kubectl label po nginx-prestop author=zhangsan
#临时修改标签
kubectl label po nginx-prestop author=lisi --overwrite
#永久修改标签
kubectl edit po nginx-prestop
#根据标签直接查询,type是标签名,app是标签值
kubectl get po -l type=app
kubectl get po -A -l type=app --show-labels
#in查询
kubectl get po -A -l 'test in (1.0.0,1.1.1)' --show-labels
#多条件查询,条件间是与的关系
kubectl get po -A -l test!=111,type=app --show-labels
2.Deployment
deployment是ReplicaSet的更高层次的封装,提供了更丰富的功能。
ReplicaSet帮我们动态更新pod副本数量,可以通过selector选择对哪些pod生效
(1)创建
#先删除之前的pod
kubectl delete po nginx-prestop
#创建文件夹
cd /opt/k8s/
mkdir deployments
cd deployments/
#创建一个deployment
kubectl create deploy nginx-deploy --image=nginx:1.7.9
kubectl get deployments
kubectl get deploy
kubectl get replicaset
kubectl get po
kubectl get po,rs,deploy --show-labels
#查看deployment配置信息
kubectl get deploy nginx-deploy -o yaml
#复制一下,如果格式不对,使用 :set paste
vim nginx-deploy.yaml
#########################################
apiVersion: apps/v1 #版本
kind: Deployment #资源类型
metadata: #元数据
labels: #标签
app: nginx-deploy #具体的key,value
name: nginx-deploy #deployment名字
namespace: default #命名空间
spec:
replicas: 1 #副本数量
revisionHistoryLimit: 10 #进行滚动更新后,保留的历史版本数量
selector: #选择器,用于找到匹配的rs
matchLabels: #根据标签匹配
app: nginx-deploy #标签的key,value
strategy: #更新策略
rollingUpdate: #采用滚动更新配置
maxSurge: 25% #进行滚动更新时,更新的个数可以超过最大副本数量的比例
maxUnavailable: 25% #滚动更新时,最多有几个更新不成功
type: RollingUpdate #更新类型:滚动更新
template: #pod模板
metadata: #pod元数据
labels: #pod标签
app: nginx-deploy
spec: #pod期望信息
containers: #pod的容器
- image: nginx:1.7.9 #镜像
imagePullPolicy: IfNotPresent #拉取策略
name: nginx #容器名称
restartPolicy: Always #重启策略
#########################################
(2)滚动更新
只有修改了 deployment 配置文件中的 template 中的属性后,才会触发更新操作。
先把副本变成多个:
cd /opt/k8s/deployments/
kubectl edit deploy nginx-deploy
#########################
我们将副本数从1变成3
spec:
replicas: 3
#########################
#查看
kubectl get deploy --show-labels
kubectl rollout status deploy nginx-deploy
kubectl describe deploy nginx-deploy
kubectl get deployments
kubectl get po,rs,deploy --show-labels
上述日志可以看到,我们执行更新,会启动一个新的rs,每启动一个新的,同时会关闭一个旧的。
滚动更新并行:
假设当前有 5 个 nginx:1.7.9 版本,你想将版本更新为 1.9.1,当更新成功第三个以后,你马上又将期望更新的版本改为 1.9.2,那么此时会立马删除之前的三个,并且立马开启更新 1.9.2 的任务。
(3)版本回退
spec.revisonHistoryLimit 来指定 deployment 保留多少 revison,如果设置为 0,则不允许 deployment 回退了。
#先设置一个错误的更新:手动设置错误镜像版本
kubectl set image deployment/nginx-deploy nginx=nginx:1.91 --record 更改版本
#查看日志,会发现下载不下来这个镜像
kubectl rollout status deployments nginx-deploy
kubectl get rs
kubectl get pods
#查看历史版本
kubectl rollout history deployment/nginx-deploy
# 回退上一个版本
kubectl rollout undo deployment/nginx-deploy
#回退指定版本
kubectl rollout undo deployment/nginx-deploy --to-revision=2
#查看
kubectl describe deploy nginx-deploy
(4)扩容和缩容
扩容与缩容只是直接创建副本数,没有更新 pod template 因此不会创建新的 rs
方法一:修改配置文件
kubectl edit deploy nginx-deploy
#########################
我们将副本数从1变成3
spec:
replicas: 3
#########################
方法二:命令扩缩容
kubectl scale --replicas=6 deploy nginx-deploy
kubectl get pods,rs,deploy
(5)暂停与恢复 滚动更新
由于每次对 pod template 中的信息发生修改后,都会触发更新 deployment 操作,那么此时如果频繁修改信息,就会产生多次更新。
而实际上只需要执行最后一次更新即可,当出现此类情况时我们就可以暂停 deployment 的 rollout。
我们先直接修改,可以看到更新了:
kubectl edit deploy nginx-deploy
#################################################
在sepc.template.spec下面新增
resources:
requests:
cpu: 100m
memory: 128Mi
#################################################
kubectl get rs
暂停、恢复自动更新:
#暂停滚动更新
kubectl rollout pause deploy nginx-deploy
#再次编辑配置文件
kubectl edit deploy nginx-deploy
#查看历史版本
kubectl rollout history deploy nginx-deploy
kubectl rollout history deploy nginx-deploy --revision=6
#恢复自动更新
kubectl rollout resume deploy nginx-deploy
#查看历史版本
kubectl rollout history deploy nginx-deploy
kubectl rollout history deploy nginx-deploy --revision=7
3.StatefulSet:有状态的服务
上面是无状态应用,但是一些有状态应许需要用到本地的一些资源,就不能无脑扩容了。而是需要使用有状态的服务sts
(1)创建sts
cd /opt/k8s/
mkdir statefulset
cd statefulset/
vim web.yaml
######################################################################
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet #资源类型
metadata:
name: web #对象名称
spec:
serviceName: "nginx" #使用哪个service管理管理dns
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports: #容器内部要暴露的端口
- containerPort: 80 #具体暴露的端口
name: web #端口配置的名字
volumeMounts: #加载数据卷
- name: www #指定加载哪个数据卷
mountPath: /usr/share/nginx/html #加载到容器中的哪个目录
volumeClaimTemplates: #数据卷模板
- metadata: #数据卷描述
name: www #数据卷名称
annotations: #数据卷注解信息
volume.alpha.kubernetes.io/storage-class: anything
spec: #数据卷规约配置
accessModes: [ "ReadWriteOnce" ] #访问模式
resources:
requests:
storage: 1Gi #需要一个G存储资源
######################################################################
#删除之前的nginx
kubectl delete deploy nginx-deploy
kubectl delete svc nginx
#启动statefulset
kubectl create -f web.yaml
#查看服务、statefulset,持久卷
kubectl get svc
kubectl get sts
kubectl get pvc
#查看持久卷信息
kubectl describe pvc www-web-0
可以看到,截至目前,我们存储卷挂载不成功:
我们这里先不加存储卷,后面再加,先把sts启动起来:
rm -rf .web.yaml.swp
vim web.yaml
##############################################
将存储卷相关的删除
##############################################
#删除上面的配置
kubectl delete sts web
kubectl delete svc nginx
kubectl delete pvc www-web-0
#重新创建
kubectl create -f web.yaml
#查看
kubectl get sts,svc
kubectl get po
#测试一下我们新建的sts能不能访问,但是肯定不能主机访问容器,得容器访问容器
#测试一下,这是一个测试容器
kubectl run -it --image busybox:1.28.4 dns-test --restart=Never --rm /bin/sh
nslookup web-0.nginx
配置文件图如下:
测试容器图如下:
(2)扩容缩容
#扩容
kubectl scale sts web --replicas=5
#查看
kubectl get sts
kubectl describe sts web
(3)滚动更新
由于 pod 是有序的,在 StatefulSet 中更新时是基于 pod 的顺序倒序更新的:
#滚动更新image版本号
kubectl patch sts web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"nginx:1.9.1"}]'
#查看
kubectl rollout history sts web
kubectl rollout history sts web --revision=2
kubectl rollout status sts web
kubectl describe sts web
(4)基于滚动更新实现灰度(金丝雀)发布
*1)什么是灰度(金丝雀)发布
滚动更新的特点是,会一个一个更新我们的容器,每更新一个就会下掉一个之前的容器。
当我们项目有一个新版本要发布,也不确定上线之后会不会对线上有影响,我们可以把3台机器不全更新,只更新1个运行一段时间,发现没有问题,再一步步替换线上的机器,直到把所以得机器都替换完
*2)灰度(金丝雀)发布实现
我们查看sts的配置文件,会发现帮我们自动生成了更新策略,其中有一个属性叫partition:
kubectl edit sts web
##########################################
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
##########################################
具体实现:
#扩容到5个
kubectl scale sts web --replicas=5
#编辑
kubectl edit sts web
##################################################
变更一下nginx的版本,并且将partition设置为3
##################################################
#查看
kubectl describe po web-3
kubectl describe po web-2
#可以看到,web-0,web-1,web-0还是之前的版本
#但是web-3,web-4变成了新的版本
#即:下标 >= 我们设置的数值的容器会更新
#因为默认是0,就表示下标 >= 0 的会更新,即会更新全部
修改yaml图如下:
查看图如下:
(5)删除时更新
更新策略变成OnDelete:
#更改更新策略
kubectl edit sts web
#############################
updateStrategy:
type: OnDelete
#############################
#更改nginx版本
kubectl edit sts web
#可以看到更改的并没有更新
kubectl describe po web-4
#删除web-4,删完后会发现又启动一个新的,查看后发现更新了
kubectl delete po web-4
kubectl describe po web-4
(6)删除
级联删除:
#级联删除,将sts,rs,pvc,po删除
kubectl delete sts web
# 删除 service
kubectl delete service nginx
非级联删除:
kubectl create -f web.yaml
#只删除sts,没有删除po
kubectl delete sts web --cascade=false
#手动删除po
kubectl delete po web-0 web-1
# 删除 service
kubectl delete service nginx
4.DaemonSet守护进程
node会有一个DaemonSet守护进程。但是哪些节点需要配置,哪些节点不需要,如果节点原本不需要的现在需要了,我们守护进程应该怎么设置上去呢?
(1)ds创建
cd /opt/k8s/
mkdir daemonset
cd daemonset/
vim fluentd-ds.yaml
#################################################################
apiVersion: apps/v1
kind: DaemonSet #创建daemon set资源对象
metadata:
name: fluentd #名字
spec:
selector:
matchLabels:
app: logging
template:
metadata:
labels:
app: logging
id: fluentd
name: fluentd
spec:
containers:
- name: fluentd-es
image: agilestacks/fluentd-elasticsearch:v1.3.0
env: #环境变量配置
- name: FLUENTD_ARGS #环境变量的key
value: -qq #环境变量的value
volumeMounts: #加载数据卷,避免数据丢失
- name: containers #数据卷的名字
mountPath: /var/lib/docker/containers #将数据卷挂载到容器内的哪个目录
- name: varlog
mountPath: /varlog
volumes: #定义数据卷
- hostPath: #数据卷类型:主机路径的模式,与node共享目录
path: /var/lib/docker/containers #node中的共享目录
name: containers #定义的数据卷名称
- hostPath:
path: /var/log
name: varlog
#################################################################
#创建服务
kubectl create -f fluentd-ds.yaml
#查看
kubectl get ds,po
注:如果你的es镜像一直拉不下来,更换如下:
anjia0532/google-containers.fluentd-elasticsearch:v2.2.0
(2)nodeSelector使ds动态适配节点
我们可以看到,启动ds之后,两个节点141,142都有ds守护进程。我们想要只给141设置,不想给142设置怎么办?
#查看节点,有3个节点
kubectl get nodes
kubectl get nodes --show-labels
#给141节点动态添加一个标签
kubectl label no kubernete141 type=test
kubectl get nodes --show-labels
kubectl get po -o wide
#修改ds的配置文件
kubectl edit ds fluentd
#######################################
#在第二级的spec下面添加nodeSelector
spec:
template:
spec:
nodeSelector:
type: test
#######################################
#查看,原本2个变成一个了
kubectl get ds,po
kubectl get po -l app=logging
kubectl get po -l app=logging -o wide
#我们再给142加一个标签,就又变成2个了
kubectl label no kubernete142 type=test
kubectl get po -l app=logging -o wide
修改配置文件图如下:
查看运行结果图如下:
(3)更新策略设置
我们守护进程可能会在很多节点上都配置,如果设置成滚动更新,一旦有变动可能几十个上百个都要更新,建议把ds设置成OnDelete,要更新哪个就去删一下然后自动更新即可:
kubectl edit ds fluentd
########################################
updateStrategy:
type: OnDelete
########################################
5.HPA自动扩缩容
通过观察 pod 的 cpu、内存使用率或自定义 metrics 指标进行自动的扩容或缩容 pod 的数量。
通常用于 Deployment、sts,不适用于无法扩/缩容的对象,如 DaemonSet。
控制管理器每隔30s(可以通过–horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况。
(1)开启metrics指标服务
# 修改镜像地址为国内的地址
sed -i 's/k8s.gcr.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
# 下载 metrics-server 组件配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server-components.yaml
#将下载下来的文件放到component目录下
cd /opt/k8s/
mkdir component
cd deployments/
mv metrics-server-components.yaml ../component/
#修改镜像,查看我们镜像下载地址,替换成阿里云的地址
grep image metrics-server-components.yaml
sed -i 's/registry.k8s.io\/metrics-server/registry.cn-hangzhou.aliyuncs.com\/google_containers/g' metrics-server-components.yaml
#编辑配置文件
vim metrics-server-components.yaml
###########################################
#第140行新增如下,不验证 tls
- --kubelet-insecure-tls
###########################################
#启动
kubectl apply -f metrics-server-components.yaml
#查看
kubectl get po --all-namespaces | grep metrics
添加的配置文件图如下:
启动之后的图如下:
(2) 测试HPA自动扩缩容
#先启动一个deploy
cd /opt/k8s/deployments/
kubectl create -f nginx-deploy.yaml
kubectl get deploy
#新增指标设置
vim nginx-deploy.yaml
#######################################
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
#######################################
#配置文件覆盖
kubectl replace -f nginx-deploy.yaml
#cpu占用到20%就会扩容,扩容最小扩容到2个,最多扩容到5个
kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5
#查看cpu使用情况
kubectl top pods
#目前我们在子机器141,142各有一各服务,我们先用service把这两个聚合到一起
vim nginx-svc
##################################################
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
app: nginx
spec:
selector:
app: nginx-deploy
ports:
- port: 80
targetPort: 80
name: web
type: NodePort
##################################################
#启动service
kubectl create -f nginx-svc.yaml
#查看
kubectl get svc
#子机器新开一个窗口,我们做一个死循环去访问nginx,这里的ip就是上面查看svc里面的ip
while true; do wget -q -O- http://10.101.93.194 > /dev/null ; done
#查看,可以看到自动扩容到5个副本了
kubectl top pods
kubectl get hpa
新增指标图如下:
查看service的ip如下:
扩容结果如下:
四、感谢支持
感谢各位大佬支持,如果觉得满意可以请喝一杯咖啡吗: