第八课 Docker践行DevOps理念-容器编排Kubernetes
tags:
- Docker
- 慕课网
categories:
- Kubernetes
- k8s环境安装
- k8s基本使用
文章目录
第一节 Kubenetes简介
1.1 Kubernetes介绍
- 起源于google公司容器编排工具。
- 开始swarms和Kubernetes是竞争关系。
- Docker公司内置swarms一系列努力,并没有能让Docker Swarm走上容器编排的巅峰。
- 相反,Kubernetes因为其优秀的架构和健康的社区环境,得到迅速发展,在生产环境中得到了广泛的应用,然后用户反馈,社区回应,良性循环了下去。2017年各大厂商都开始拥抱Kubernetes。
- 最终,Docker宣布在自家企业版里支持Kubernetes和Swarm一起作为容器编排的解决方案供用户选择。
- Kubernetes架构图。
- Master节点通过CLI和UI输入命令,通过调度算法运行哪个节点,control控制拓展等操作。etcd是分布式存储用来存储我们的配置。
- Node节点
- pod在k8s的概念中。pod的基本上是我们在容器中调度的最小单位。(具有相同的NameSpace的Container的组合)
- kubelet 创建容器的管理
- kube-proxy 端口的代理和转发
- Fluentd 日志的采集存储和查询
- k8s重量级人物(可以翻墙搜一下Kelsey Hightower): https://github.com/kelseyhightower
第二节 k8s环境安装
2.1 k8s环境的方法
- 本地搭建开发测试的k8s只有一个节点,这个节点既是Master又是Worker
- minikube: https://minikube.sigs.k8s.io/docs/
- 本地搭建一个k8s的集群kubeadm 多节点
- kubeadm: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- 一些云服务商会提供快速搭建K8s集群的服务。
- 谷歌的:cloud.google.com/kubernetes-engine/
2.2 在windows系统上安装使用minikube
- github: https://github.com/kubernetes/minikube
- 安装说明:https://minikube.sigs.k8s.io/docs/start/
- windows下载:https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe
- kubectl是我们k8s的命令行的API。通过命令行的方式和k8s server通信,操作控制k8s的集群。
- https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-windows
- 下载完之后,复制到D:\Program Files\Kubernetes\Minikube。这样就不用配置环境变量啦
- 安装后打开电脑的powershell,输入minikube。如果有输出表示安装完成。
- 需要安装Virtualbox。
- 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集群
- 准备三台物理机 centos7.6以上。vagrant up
- 检查三个节点已经安装了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
- 检查安装是否成功,并配置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
- 一般如下图,k8s集群就安装好了。
2.4 云平台K8S环境
- 谷歌云
- 阿里云
- AWS云
第三节 k8s基本概念和使用
3.1 kubectl的基本使用
- kubectl是跟我们k8s通信的命令行接口。
- kubectl completion -h 查看在各个平台上kubectl自动补全的方法。Tab按键补全可以提升效率
- kubectl get node 查看所有的节点。
- kubectl 如何与k8s进行通信呢。
- 用户的./kube目录下有一个config的配置。
- 查看配置也可以通过 kubectl config的电脑直接操作,minikube和多节点的k8s。
- kubectl config current-context
- kubectl config use-context minikube # 切换到minikube
3.2 k8s的节点和标签
- 查看具体节点的具体信息:kubectl describe node k8s-master
- 查看所有节点的信息 -o :
- kubectl get node -o wide 查看更多信息
- kubectl get node -o yaml 输出yaml格式
- kubectl get node -o json 输出json格式
- 命令kubectl get node --show-labels 可以用来查看label
- 添加label。 k8s中很多对象都可以添加label。kubectl label node k8s-master env=test
- 删除label. kubectl label node k8s-master env-
- 下图中的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
- 一个或者一组应用容器,它们分享资源(比如volume )
- 分享相同命名空间(如网络空间)的容器。
- Pod是k8s中最小的调度单位.
- 它通过yml文件定义。
- 动手实验。
- 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"]
- 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。
- 上面问题的解决办法:
- 在/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命名空间
- 不同的团队使用同一套k8s我们最好对Namespace做一下隔离, 防止不同组的人pod名字冲突。
- Namespace命名空间用于不同team,不同project之间的隔离。
- 在不同的命名空间中,各种资源的名字是相互独立,比如可以具有相同名称的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
- 当我们使用不同的namespace时, 可以简单快捷的做一个客户化的设置。
- 查看当前的context。 kubectl config current-context
- 查看user和cluster: 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
# 查看当前的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
- etcd 分布式数据库
- API server提供对外通信的。kubectl 连接它控制集群。
- scheduler 调度器。调度pod
- Controlle的功能。desired期望状态,current当前状态。让当前状态达到期望状态。
for {
desired := getDesiredState()
current := getCurrentState()
makeChanges(desired, current)
}
- 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的基本操作
- 三个文件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
- 实验运行。
- 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更新中的作用
- 上面实现更新拓展其实后台是由Replicaset容器来维护的。
- 可以更新和拓展, 还可以进行历史回退
# 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