2.k8s:集群搭建。深入理解:pod探针,label和selector,deployment,statefulSet,daemonSet守护进程,HPA自动扩缩容

目录​​​​​​​

一、kubernetes集群环境搭建

1.前置知识点

2.环境准备

3.kubeadm方式搭建前置准备

1.克隆虚拟机

2.初始操作

4.安装k8s集群

1.安装docker

2.安装k8s组件

3.主节点部署k8s master

4.子节点加入主节点

5.配置网络

6.测试k8s集群

5.在任意节点使用kubectl

6.资源类型别名

7.格式化输出

二、pod深入了解

1.配置文件

2.探针

(1)探针的类型

(2)探针探测方式

*1)ExecAction:命令方式

*2)TCPSocketAction:Tcp方式

*3)HTTPGetAction:HTTP方式

(4)探针的使用

3.生命周期

(1)整体流程

(2)钩子函数应用

三、资源调度

1.Label和Selector

2.Deployment

(1)创建

(2)滚动更新

(3)版本回退

(4)扩容和缩容

(5)暂停与恢复 滚动更新

3.StatefulSet:有状态的服务

(1)创建sts

(2)扩容缩容 

(3)滚动更新

(4)基于滚动更新实现灰度(金丝雀)发布

*1)什么是灰度(金丝雀)发布

*2)灰度(金丝雀)发布实现

(5)删除时更新

(6)删除

4.DaemonSet守护进程

(1)ds创建

(2)nodeSelector使ds动态适配节点

(3)更新策略设置

5.HPA自动扩缩容

(1)开启metrics指标服务

(2) 测试HPA自动扩缩容

四、感谢支持


一、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)整体流程

  1. 最开始会有一个初始化阶段,该阶段会初始化多个容器
  2. 初始化完之后,会执行postStart的钩子函数,并且同时会执行command指令。
    1. 这里有一个问题,我们倾向于认为钩子函数执行好之后再执行command指令,但是很多时候他们的顺序并不是这样的,钩子函数可能会在command之后,因此,一些初始化的东西最好在初始化阶段做完,很少在钩子函数里做
  3. 执行启动探针,确认是否真的启动好
  4. 执行就绪探针、存活探针
  5. 在关闭前还会执行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如下:

扩容结果如下:

四、感谢支持

感谢各位大佬支持,如果觉得满意可以请喝一杯咖啡吗:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏哥哥啊Aaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值