第八课 Docker践行DevOps理念-容器编排Kubernetes

第八课 Docker践行DevOps理念-容器编排Kubernetes

tags:

  • Docker
  • 慕课网

categories:

  • Kubernetes
  • k8s环境安装
  • k8s基本使用

第一节 Kubenetes简介

1.1 Kubernetes介绍

  1. 起源于google公司容器编排工具。
  2. 开始swarms和Kubernetes是竞争关系。
  3. Docker公司内置swarms一系列努力,并没有能让Docker Swarm走上容器编排的巅峰。
  4. 相反,Kubernetes因为其优秀的架构和健康的社区环境,得到迅速发展,在生产环境中得到了广泛的应用,然后用户反馈,社区回应,良性循环了下去。2017年各大厂商都开始拥抱Kubernetes。
  5. 最终,Docker宣布在自家企业版里支持Kubernetes和Swarm一起作为容器编排的解决方案供用户选择。
  6. Kubernetes架构图。
    在这里插入图片描述
  7. Master节点通过CLI和UI输入命令,通过调度算法运行哪个节点,control控制拓展等操作。etcd是分布式存储用来存储我们的配置。
    在这里插入图片描述
  8. Node节点
    • pod在k8s的概念中。pod的基本上是我们在容器中调度的最小单位。(具有相同的NameSpace的Container的组合)
    • kubelet 创建容器的管理
    • kube-proxy 端口的代理和转发
    • Fluentd 日志的采集存储和查询
      在这里插入图片描述
  9. k8s重量级人物(可以翻墙搜一下Kelsey Hightower): https://github.com/kelseyhightower

第二节 k8s环境安装

2.1 k8s环境的方法

  1. 本地搭建开发测试的k8s只有一个节点,这个节点既是Master又是Worker
    • minikube: https://minikube.sigs.k8s.io/docs/
  2. 本地搭建一个k8s的集群kubeadm 多节点
    • kubeadm: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
  3. 一些云服务商会提供快速搭建K8s集群的服务。
    • 谷歌的:cloud.google.com/kubernetes-engine/

2.2 在windows系统上安装使用minikube

  1. github: https://github.com/kubernetes/minikube
  2. 安装说明:https://minikube.sigs.k8s.io/docs/start/
  3. windows下载:https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe
  4. kubectl是我们k8s的命令行的API。通过命令行的方式和k8s server通信,操作控制k8s的集群。
    • https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-windows
    • 下载完之后,复制到D:\Program Files\Kubernetes\Minikube。这样就不用配置环境变量啦
  5. 安装后打开电脑的powershell,输入minikube。如果有输出表示安装完成。
  6. 需要安装Virtualbox。
  7. Win10 Hyper-V和VirtualBox会有冲突的问题。
    • 关掉 Hyper-V管理员进入powershell: bcdedit.exe /set hypervisorlaunchtype off
    • 重启电脑
# 测试本地是否安装成功
minikube
# 创建启动本地 kubernetes 集群 翻墙后可以成功就是有点慢
# 支持不同的Kubernetes版本 --kubernetes -version
minikube start  --driver='virtualbox' --image-mirror-country=cn  --registry-mirror=https://eyzd1v97.mirror.aliyuncs.com
# 进入minikube
minikube ssh
docker ps
# 安装kubectl 添加环境变量
kubectl version --client
kubectl get pod --help
# 这一步要把minkube启动起来 查看他们的namespace -A 有输出配置正确
kubectl get pod -A

2.3 使用kubeadm搭建多节点K8S集群

  1. 准备三台物理机 centos7.6以上。vagrant up
  2. 检查三个节点已经安装了kubeadm , kubelet and kubectl ,并且docker已经运行了
    • https://kuboard.cn/install/install-k8s.html#%E5%AE%89%E8%A3%85docker%E5%8F%8Akubelet
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [
    {
        :name => "k8s-master",
        :eth1 => "192.168.205.120",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "k8s-node1",
        :eth1 => "192.168.205.121",
        :mem => "2048",
        :cpu => "1"
    },
    {
        :name => "k8s-node2",
        :eth1 => "192.168.205.122",
        :mem => "2048",
        :cpu => "1"
    }

]

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"
  boxes.each do |opts|
    config.vm.define opts[:name] do |config|
      config.vm.hostname = opts[:name]
      config.vm.provider "vmware_fusion" do |v|
        v.vmx["memsize"] = opts[:mem]
        v.vmx["numvcpus"] = opts[:cpu]
      end
      config.vm.provider "virtualbox" do |v|
        v.customize ["modifyvm", :id, "--memory", opts[:mem]]
        v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
      end
      config.vm.network :private_network, ip: opts[:eth1]
    end
  end
  config.vm.provision "shell", privileged: true, path: "./setup.sh"
end
# 配置阿里镜像
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
# 更新源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  
sudo yum clean all  
sudo yum makecache fast
sudo yum update


# 安装依赖包和docker
sudo yum install -y yum-utils lvm2 git vim gcc glibc-static telnet bridge-utils net-tools bind-utils wget device-mapper-persistent-data nfs-utils
sudo yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io


# 添加vagrant到docker组中
sudo gpasswd -a vagrant docker # 把当前用户添加到docker组中
sudo systemctl restart docker


# 配置K8S的yum源
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


# 也可以尝试国内的源 http://ljchen.net/2018/10/23/%E5%9F%BA%E4%BA%8E%E9%98%BF%E9%87%8C%E4%BA%91%E9%95%9C%E5%83%8F%E7%AB%99%E5%AE%89%E8%A3%85kubernetes/
sudo setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# install kubeadm, kubectl, and kubelet.
sudo yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0


cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
sudo sysctl --system

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

# 修改docker Cgroup Driver为systemd
sudo sed -i "s#^ExecStart=/usr/bin/dockerd.*#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd#g" /usr/lib/systemd/system/docker.service
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable kubelet
sudo systemctl restart kubelet
  1. 检查安装是否成功,并配置Master主节点。
# 检查是否安装成功
which kubeadm
which kubelet
which kubectl
docker version
# 初始化 10.100.0.0/16 为创建pod指定的网段 可以自己设置网段cidr规则
kubeadm config images list
# 发现报错  WARNING: kubeadm cannot validate component configs for API groups


# 运行脚本如下 镜像到了阿里云的杭州机房的容器仓库里,拉取还是比较快的
echo ""
echo "=========================================================="
echo "Pull Kubernetes v1.18.0 Images from aliyuncs.com ......"
echo "=========================================================="
echo ""

MY_REGISTRY=registry.cn-hangzhou.aliyuncs.com/openthings

## 拉取镜像
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.4.3-0
docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.2
docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.6.7

## 添加Tag
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.2 k8s.gcr.io/pause:3.2
docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

echo ""
echo "=========================================================="
echo "Pull Kubernetes v1.18.0 Images FINISHED."
echo "into registry.cn-hangzhou.aliyuncs.com/openthings, "
echo "           by openthings@https://my.oschina.net/u/2306127."
echo "=========================================================="

echo ""

# 全新安装指定版本 --kubernetes-version=v1.18.0 因为上面下来的就是1.18.0的版本所以这里要指定
sudo kubeadm init --kubernetes-version=v1.18.0 --pod-network-cidr 10.100.0.0/16 --apiserver-advertise-address 192.168.205.120

#这个要保存好  sudo kubeadm join 192.168.205.120:6443 --token qvb0jq.wn7kuba42tqqfhp1     --discovery-token-ca-cert-hash sha256:a43099ac5fbd32187ce02c0ec68e77a451e7a2b1a014f15708c6a7837e1a0f75

# 配置当前用户环境
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 检查版本
kubectl version

# 查看Pod信息
kubectl get pod --all-namespaces

# 安装kubelet网络插件weave
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
# 查看pod状态 这里一定要等着所有容器都运行在加子节点
kubectl get pods -n kube-system

在这里插入图片描述
在这里插入图片描述
4. 添加子节点。

# 先运行脚本 拉取镜像 防止一直处于ContainerCreating排查和解决
## 拉取镜像
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:v1.18.0
docker pull ${MY_REGISTRY}/k8s-gcr-io-etcd:3.4.3-0
docker pull ${MY_REGISTRY}/k8s-gcr-io-pause:3.2
docker pull ${MY_REGISTRY}/k8s-gcr-io-coredns:1.6.7

## 添加Tag
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-apiserver:v1.18.0 k8s.gcr.io/kube-apiserver:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-scheduler:v1.18.0 k8s.gcr.io/kube-scheduler:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-controller-manager:v1.18.0 k8s.gcr.io/kube-controller-manager:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-kube-proxy:v1.18.0 k8s.gcr.io/kube-proxy:v1.18.0
docker tag ${MY_REGISTRY}/k8s-gcr-io-etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag ${MY_REGISTRY}/k8s-gcr-io-pause:3.2 k8s.gcr.io/pause:3.2
docker tag ${MY_REGISTRY}/k8s-gcr-io-coredns:1.6.7 k8s.gcr.io/coredns:1.6.7

echo ""
echo "=========================================================="
echo "Pull Kubernetes v1.18.0 Images FINISHED."
echo "into registry.cn-hangzhou.aliyuncs.com/openthings, "
echo "           by openthings@https://my.oschina.net/u/2306127."
echo "=========================================================="

echo ""

# 两个节点机器中运行
sudo kubeadm join 192.168.205.120:6443 --token j1s7e9.f2e2ambbzyxgc7gv --discovery-token-ca-cert-hash sha256:50ea5387db6f696fb34665e2964a0fa0d147100ac0dda93486e67dc45b01624c
# 主节点机上运行 查看节点
kubectl get nodes
kubectl get pod --all-namespaces
# 如果发现还是出现 Kubernetes创建pod一直处于ContainerCreating排查和解决一般时镜像拉取的问题。master上看下版本手动到节点处安装
# 主节点移除节点后重启 拉取镜像后 重新添加
kubectl delete node k8s-node1
docker pull weaveworks/weave-npc:2.6.2
docker pull weaveworks/weave-kube:2.6.2
  1. 一般如下图,k8s集群就安装好了。
    在这里插入图片描述

2.4 云平台K8S环境

  1. 谷歌云
  2. 阿里云
  3. AWS云

第三节 k8s基本概念和使用

3.1 kubectl的基本使用

  1. kubectl是跟我们k8s通信的命令行接口。
  2. kubectl completion -h 查看在各个平台上kubectl自动补全的方法。Tab按键补全可以提升效率
  3. kubectl get node 查看所有的节点。
  4. kubectl 如何与k8s进行通信呢。
    • 用户的./kube目录下有一个config的配置。
    • 查看配置也可以通过 kubectl config的电脑直接操作,minikube和多节点的k8s。
      • kubectl config current-context
      • kubectl config use-context minikube # 切换到minikube

3.2 k8s的节点和标签

  1. 查看具体节点的具体信息:kubectl describe node k8s-master
  2. 查看所有节点的信息 -o :
    • kubectl get node -o wide 查看更多信息
    • kubectl get node -o yaml 输出yaml格式
    • kubectl get node -o json 输出json格式
      在这里插入图片描述
  3. 命令kubectl get node --show-labels 可以用来查看label
  4. 添加label。 k8s中很多对象都可以添加label。kubectl label node k8s-master env=test
  5. 删除label. kubectl label node k8s-master env-
  6. 下图中的ROLES是一种特殊的label, 我们可以和label一样对其设置。
    在这里插入图片描述
kubectl get node
kubectl get node -o wide  #查看更多信息
kubectl get node -o yaml  #输出yaml格式
kubectl get node -o json  #输出json格式
kubectl get node --show-labels #可以用来查看label
# 给nodek8s-master添加label env=test
kubectl label node k8s-master env=test
# 查看label
kubectl get node --show-labels
# 删除k8s-master的env label  env-(减号)
kubectl label node k8s-master env-
# 设置ROLES 
kubectl label node k8s-node1 node-role.kubernetes.io/worker=
kubectl label node k8s-node2 node-role.kubernetes.io/worker=
kubectl get node

3.3 k8s调度的最小单位pod

  1. 一个或者一组应用容器,它们分享资源(比如volume )
  2. 分享相同命名空间(如网络空间)的容器。
  3. Pod是k8s中最小的调度单位.
    在这里插入图片描述
  4. 它通过yml文件定义。
    在这里插入图片描述
  5. 动手实验。
    • vagrant plugin install vagrant-scp --plugin-clean-sources --plugin-source https://gems.ruby-china.com/
    • vagrant scp labs ~
# nginx_busybox
apiVersion: v1
kind: Pod
metadata:
  name: nginx-busybox
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
  - name: busybox
    image: busybox
    command: ["/bin/sh"]
    args: ["-c", "while true; do echo hello; sleep 10;done"]
  1. error: unable to upgrade connection: pod does not exist 问题的解决。跟vagrant有关
    • Vagrant 在多主机模式时每个主机的 eth0 网口 ip 都是 10.0.2.15,这个网口是所有主机访问公网的出口,用于 nat 转发。
    • 而 eth1才是主机真正的 IP。kubelet 在启动时默认读取的是 eth0 网卡的 IP,因此在集群部署完后 kubect get node -o wide 查看到节点的 IP 都是 10.0.2.15
  2. 上面问题的解决办法:
    • 在/etc/sysconfig/kubelet 文件中KUBELET_EXTRA_ARGS环境变量添加 --node-ip参数
    • KUBELE_EXTRA_ARGS="–node-ip=<eth1 网口 IP>"
    • 例子:KUBELET_EXTRA_ARGS="–node-ip=192.168.205.120"
    • sudo systemctl restart kubelet
# 小技巧 如果docker重启一定要重启kubelet 下面的配置不能少 要不然kubelet重启报错

kubectl get node
# 创建一个nginx的pod 随机创建在不同机器上
kubectl create -f nginx_busybox.yml
# 查看创建的pod
kubectl get pod
kubectl get pod -o wide
# 查看pod的详细信息
kubectl describe pod nginx-busybox
# 进入pod中的容器 -c 指定pod的容器
kubectl exec nginx-busybox -c nginx -- date # 在nginx容器中执行
kubectl exec nginx-busybox -c busybox -- date # 在busybox容器中执行
kubectl exec nginx-busybox -c nginx -- hostname # 在nginx容器中执行
kubectl exec nginx-busybox -c busybox -- hostname  # 在busybox容器中执行
kubectl exec nginx-busybox -c nginx -it sh# 在nginx容器中执行
kubectl exec nginx-busybox -c busybox -it sh  # 在busybox容器中执行
# 报错error: unable to upgrade connection: pod does not exist
# kubect get node -o wide 查看到节点的 IP 都是 10.0.2.15。他们应该是我们设置的ip地址才对。
kubectl get node -o wide
# 每个节点执行下面两句话  主要是在/etc/sysconfig/kubelet 文件中KUBELET_EXTRA_ARGS 环境变量添加 --node-ip 参数:KUBELET_EXTRA_ARGS="--node-ip=<eth1 网口 IP>"
su
echo KUBELET_EXTRA_ARGS=\"--node-ip=`ip addr show eth1 | grep inet | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}/" | tr -d '/'`\" > /etc/sysconfig/kubelet
sudo systemctl restart kubelet


# 删除pod
kubectl delete -f nginx_busybox.yml
kubectl delete pod nginx_busybox

3.4 Namespace命名空间

  1. 不同的团队使用同一套k8s我们最好对Namespace做一下隔离, 防止不同组的人pod名字冲突。
  2. Namespace命名空间用于不同team,不同project之间的隔离。
  3. 不同的命名空间中,各种资源的名字是相互独立,比如可以具有相同名称的pod存在。
kubectl get namespace
kubectl create namespace demo
# 功能1 通过namespace进行过滤
kubectl get pod --namespace kube-system
# 功能2 在特定namespace里创建pod 系统会默认把我们指定的namespace放到default中
# 创建一个nginx的pod 命名空间为demo
kubectl get namespace
kubectl get pod --namespace demo
# 命名空间为demo
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

3.5 创建我们自己的context

  1. 当我们使用不同的namespace时, 可以简单快捷的做一个客户化的设置。
  2. 查看当前的context。 kubectl config current-context
  3. 查看user和cluster: kubectl config view
  4. 设置自己的的context: kubectl config set-context demo --user=kubernetes-admin --cluster=kubernetes
  5. 使用我们自己设置的context,demo。kubectl config use-context demo
# 查看当前的context
kubectl config current-context
# 查看当前的context
kubectl config view
# 设置自己的的context
kubectl config set-context demo --user=kubernetes-admin --cluster=kubernetes
# 使用我们自己设置的context, demo。
kubectl config  use-context demo
# 查看当前的context
kubectl config current-context
kubectl config view
# 删除context
kubectl config  use-context kubernetes-admin@kubernetes
kubectl config delete-context demo

第四节 Deployment的使用

4.1 Controller和Deployment

  1. etcd 分布式数据库
  2. API server提供对外通信的。kubectl 连接它控制集群。
  3. scheduler 调度器。调度pod
    在这里插入图片描述
  4. Controlle的功能。desired期望状态,current当前状态。让当前状态达到期望状态。
for {
    desired := getDesiredState()
    current := getCurrentState()
    makeChanges(desired, current)
}
  1. Deployment的英文说明。就是Controller的实现。With Kubernetes Deployments, you“describe a desired state in a Deployment object, and the Deployment fontrollerchanges the actual state to the desired state at a controlled rate,"

4.2 Deployment的基本操作

  1. 三个文件yml文件。nginx_deployment.yml, nginx_deployment_update.yml, nginx_deploymemt_scale.yml
# nginx_deployment.yml 版本1.7.9
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template: # create pods using pod definition in this template
    metadata:
      # unlike pod-nginx.yaml, the name is not included in the meta data as a unique name is
      # generated from the deployment name
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
# nginx_deployment_update.yml 版本1.8.0
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8 # Update the version of nginx from 1.7.9 to 1.8
        ports:
        - containerPort: 80
# nginx_deploymemt_scale.yml 版本1.8.0
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 4 # Update the replicas from 2 to 4
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80
  1. 实验运行。
    • create
    • update 更新或创建
# 创建deployment
kubectl create -f nginx_deployment.yml
# 查看deployment
kubectl get deployment
kubectl get deployment nginx-deployment -o wide
# 有两个pod 
kubectl get pod
# 只获取nginx的pod
kubectl get pod -l app=nginx

# 演示desire对目标状态的自动创建
kubectl delete pod nginx-deployment-5bf87f5f59-b59nl
# 演示更新nginx版本 警告不用管
kubectl apply -f nginx_deployment_update.yml
# 查看版本
kubectl get deployment nginx-deployment -o wide

# 同理
kubectl apply -f nginx_deploymemt_scale.yml
kubectl get deployment nginx-deployment -o wide
kubectl get deployment nginx-deployment -o yaml
# 其他方式2更新 按住shift 输入:q 退出 直接编辑更新
kubectl edit deployment nginx-deployment # 修改后保存
# 其他方式3更新 通过直接命令 scale
kubectl scale --current-replicas=4 --replicas=2 deployment/nginx-deployment
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

# 删除deployment
kubectl delete deployment nginx-deployment

4.3 Replicaset在Deployment更新中的作用

  1. 上面实现更新拓展其实后台是由Replicaset容器来维护的。
  2. 可以更新和拓展, 还可以进行历史回退
# nginx_deployment.yml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment-test
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 4
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

在这里插入图片描述

# 创建deployment
kubectl apply -f nginx_deployment.yml
# 查看ginx-deployment-test具体详情 最后可以看到NewReplicaSet
# 这里有个字段RoLlingUpdateStrategy 滚动更新策略 需要注意下 不会一下给你更新完
kubectl describe deployment nginx-deployment-test
# 更新拓展其实后台是由Replicaset容器来维护
# 查看Replicaset的对象
kubectl get replicaset
# 拓展后查看事件多了一条
kubectl scale --current-replicas=4 --replicas=6 deployment/nginx-deployment-test
kubectl describe deployment nginx-deployment-test
kubectl get replicaset

# 可以看到维护的过程 很快 可以更新镜像查看
kubectl set image deployment/nginx-deployment-test nginx=nginx:1.9.1
kubectl rollout status deployment nginx-deployment-test

# 还可以看到 更新和拓展的历史 默认只保存两次历史 可以配置的
kubectl rollout history deployment nginx-deployment-test
# 根据历史进行回退操作 上一次历史
kubectl rollout undo deployment nginx-deployment-test
# 根据历史进行回退操作 指定历史 1
kubectl rollout undo deployment nginx-deployment-test --to-revision 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值