k8s阶段01 k8s介绍, 部署k8s集群, k8s简单使用, 应用编排快速入门
k8s介绍
Kubernetes的特点:
声明式API: 用户仅需要声明期望的目标状态; Resource Kind 控制器模式:控制器组件 Controller Platfrom for Platfrom: 用于构建平台的平台 Kubernetes + Istio = Service Mesh Kubernetes + Istio + Knative = Serverless Kubernetes + Tekton + ArgoCD = GitOps CICD Platform
Kubernetes集群的节点类型
由Master和Worker两类节点组成
◼ Master:控制节点
◼ Worker:工作节点
运行逻辑
◼ Kubernetes将所有工作节点的资源集结在一起形成一台更加强大的“服务器”,称为Kuernetes集群
◼ 计算和存储接口通过Master之上的API Server暴露
◼ 客户端通过API提交应用程序的运行请求,而后由Master通过调度算法将其自动指派至某特定的工作节点以
Pod对象的形式运行
◼ Master会自动处理因工作节点的添加、故障或移除等变动对Pod的影响
Kubernetes集群架构
Kubernetes 组件
Kubernetes集群: Master:控制平面 组件: API Server 接收管理指令:数据存取操作 CRUD: Create, Read, Update, Delete RESTful: 面向对象的编程: 抽象为类:资源类型,Resource, API Server内置了大量的资源类型 遵循类的规范,向字段赋值,创建实例:Object 数据的存储位置:etcd 自由式的K/V Scheduler 调度器,Pod Controller-Manager 支撑遵循Resource规范定义出的对象的具体的生产过程 一组特别的Controller:负责编排以Pod形式运行的工作负载 Deployment: 编排无状态应用: 部署、扩缩容、故障处理 StatefulSet:编排有状态应用 Worker:工作平面 组件: Kubelet 管控Pod Container Runtime #要求遵守规范:CRI 创建和运行容器三种工具: Docker, Containerd, CRI-O #Containerd是docker组件,天然支持CRI(不支持docker build和push功能) #早期kubelet通过docker-shim兼容docker kubelet --> docker-shim --> docker #后期docker通过cri-dockerd兼容kubelet(Marantis公司做的) kubelet --> cri-dockerd (Marantis) --> docker Container Network Interface CNI --> 用于实现跨节点的Pod间通信 插件项目: Flannel/Calico/Cilium Container Storage Interface: Kubelet内置支持多种卷驱动 emptyDir hostPath ... 扩展支持更多的存储服务 Kube-Proxy 用于把每个节点扩展为:可编程的负载均衡器 Service --> Service Object iptables/ipvs规则 AddONs: #附件 CoreDNS:必备附件 Service --> VIP Service Name: DNS域名格式: svc_name.namespace.svc.cluster.local IN A VIP VIP in PTR svc_name.namespace.svc.cluster.local #版本: SkyDNS --> KubeDNS --> CoreDNS Metrics Server Ingress Controller: Kuboard/Dashboard Prometheus Stack EFK ...
Kubernetes网络模型
Kuberentes集群存在三个网络: 节点网络: 地址配置在节点网卡上; 由管理员自行管理,或由IaaS云负责管理; Service网络: 虚拟网络,不依赖于外部网络插件 地址不会添加在任何网络接口设备上,而仅存在于iptables或ipvs规则中 IP地址仅用于作为服务标识使用; Pod网络:依赖于虚拟网络技术,通常由网络插件提供 叠加网络: VXLAN 承载网络: 路由模型: routing 底层模型:ipvlan, macvlan 地址配置在Pod的网络接口上 #外部访问,流程例: External Client --> Node Network --> Nginx Service --> Nginx Pod --> Wordpress Service --> Wordpress Pod --> MySQL Service --> MySQL Pod
Pod的类型:
静态Pod
自主式Pod
托管式Pod: 受控于工作负载型控制器的Pod
Deployment:
replicas: N
selector: ..
podTemplate:
StatefulSet:编排有状态应用
DaemonSet:编排系统级应用
Job/CronJob:作业类应用
部署集群: Master节点:1,3,5,7 #数量 组件: API Server: kube-apiserver Scheduler: kube-scheduler Controller Manager: kube-controller-manager Etcd: etcd Worker节点:取决于业务规模,2,... #数量 组件: Kubelet: kubelet CRI: Docker/Containerd/CRI-O CNI: Flannel/Calico/Cilium CSI(Optional) #对接各类存储服务驱动规范 Kube Proxy: kube-proxy #实现service的负载均衡,服务发现功能(通过label selector) 部署和运行方法: 二进制程序包,受控于systemd; 传统方式部署运行服务程序的守护进程 部署工具:kubeasz, ... 静态Pod,受控于kubelet; 编写Pod配置文件,由kubelet加载运行 部署:kubeadm,kubernetes社区的原生工具 部署Containerd: Ubuntu发行版提供的程序包 containerd Docker社区提供的程序包 containerd.io 客户端程序: crictl #推荐使用这个命令 ctr nerdctl #要自己安装
Kubernetes社区提供的集群构建工具 ◼ 负责执行构建一个最小化可用集群并将其启动等必要的基本步骤 ◼ Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等 ◼ kubeadm仅关心如何初始化并拉起一个集群,其职责仅限于下图中背景着色的部分
kubeadm: init:拉起来一个集群的控制平面(第一个节点) join:添加节点 控制平面节点 工作平面节点 config image list:列出镜像 config image pull:下载镜像 reset:重置集群节点 #在哪个节点运行就重置哪个节点(上面pod全部干掉) 计划内的reset: 1.排空节点 2.从API Server删除节点 3.重置节点 kubeadm reset -f #集群状态关闭。但对应文件,iptables规则需要自己清理 rm -rf /etc/kubernetes /var/lib/kubelet/ ... iptables -t nat -F && ipvsadm --clear #最简单重启系统,内核会把这些规则都清掉
使用kubeadm部署Kubernetes集群的前提条件
◼ 支持Kubernetes运行的Linux主机,例如Debian、RedHat及其变体等
◼ 每主机2GB以上的内存,以及2颗以上的CPU
◼ 各主机间能够通过网络正常通信,支持各节点位于不同的网络中
◼ 独占的hostname、MAC地址以及product_uuid,主机名能够正常解析
◼ 放行由Kubernetes使用到的各端口,或直接禁用iptables
◼ 禁用各主机的上的Swap设备
◼ 各主机时间同步
准备代理服务,以便接入registry.k8s.io,或根据部署过程提示的方法获取相应的Image
重要提示:
◼ kubeadm不仅支持集群部署,还支持集群升级、卸载、更新数字证书等功能
◼ 目前,kubeadm为各节点默认生成的SSL证书的有效期限为1年,在到期之前需要renew这些证书
部署步骤:
1、每节点部署一个选定的容器运行时; docker、cri-dockerd containerd/containerd.io 2、每节点部署kubelet、kubeadm和kubectl; 3、部署控制平面的第一个节点; kubeadm init 向初始化命令传递配置参数的方法: (1) 命令行选项; (2) 配置文件; 附加步骤:部署一个选定的网络插件 4、将各工作节点加入控制平面的第一个节点创建出的集群; kubeadm join 部署文档: https://mp.weixin.qq.com/s/7i68jmvi2eo_6wlqYEOupQ
开始部署
#1.准备4台机器,前置操作 #禁用swap [root@ubuntu ~]#swapoff -a #时间同步 [root@ubuntu ~]#apt install -y chrony [root@ubuntu ~]#systemctl status chrony #/etc/hosts文件配置 ip和主机名 10.0.0.151 kubeapi.magedu.com master01 10.0.0.152 node01 10.0.0.153 node02 10.0.0.154 node03 #2.安装containerd.io,kubelet,kubeadm,kubectl #查看cluster-install.sh和install-kubeadm.yaml https://github.com/iKubernetes/learning-k8s/tree/master/ansible-k8s-install ------------------------------------- [root@ubuntu ~]#vim cluster-install.sh #!/bin/bash # # 请把如下四个变量的值修改为实际环境中用于部署Kubernetes集群的主机的IP地址; MASTER_IP='10.0.0.151' NODE_01_IP='10.0.0.152' NODE_02_IP='10.0.0.153' NODE_03_IP='10.0.0.154' # install ansible sudo apt-add-repository -y ppa:ansible/ansible sudo apt update sudo apt install -y ansible # generate ansible iventory hosts cat <<EOF >> /etc/ansible/hosts [master] ${MASTER_IP} node_ip=${MASTER_IP} [nodes] ${NODE_01_IP} node_ip=${NODE_01_IP} ${NODE_02_IP} node_ip=${NODE_02_IP} ${NODE_03_IP} node_ip=${NODE_03_IP} EOF # install containerd.io and kubeadm/kubelet/kubectl ansible-playbook install-kubeadm.yaml # create kubernetes cluster control plane and add work nodes #ansible-playbook install-k8s-flannel.yaml ------------------------------------------------- [root@ubuntu ~]#cat install-kubeadm.yaml - hosts: all become: true vars: kube_version: "v1.31" kube_release: "1.31.2-1.1" tasks: - name: Install packages that allow apt to be used over HTTPS apt: name: "{{ packages }}" state: present vars: packages: - apt-transport-https - ca-certificates - curl - gnupg-agent - software-properties-common - name: Add the apt signing key for Docker apt_key: url: https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg state: present - name: Add the apt repository for the stable Docker version apt_repository: repo: deb [arch=amd64] https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu jammy stable state: present - name: Install Containerd and its dependencies apt: name: "{{ packages }}" #state: present state: latest update_cache: yes vars: packages: - docker-ce - docker-ce-cli - containerd.io notify: - docker status - name: Copy containerd config file with owner and permissions ansible.builtin.copy: src: files/containerd-config.toml dest: /etc/containerd/config.toml owner: root group: root mode: '0640' register: containerdconfig - name: Restart containerd.io service: name: containerd daemon_reload: yes state: restarted when: containerdconfig.changed - name: Copy crictl config file with owner and permissions ansible.builtin.copy: src: files/crictl.yaml dest: /etc/crictl.yaml owner: root group: root mode: '0644' - name: Remove swapfile from /etc/fstab mount: name: "{{ item }}" fstype: swap state: absent with_items: - swap - none - name: Disable swap command: swapoff -a when: ansible_swaptotal_mb > 0 - name: Add the apt signing key for Kubernetes ansible.builtin.apt_key: url: https://mirrors.aliyun.com/kubernetes-new/core/stable/{{ kube_version }}/deb/Release.key keyring: /etc/apt/keyrings/kubernetes-apt-keyring.gpg state: present - name: Add the apt repository for Kubernetes apt_repository: repo: deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/{{ kube_version }}/deb/ / state: present filename: kubernetes.list - name: Install Kubernetes binaries apt: name: "{{ packages }}" update_cache: yes vars: packages: - kubelet={{ kube_release }} - kubeadm={{ kube_release }} - kubectl={{ kube_release }} - name: Configure --node-ip for kubelet lineinfile: path: /etc/default/kubelet regexp: "^KUBELET_EXTRA_ARGS=.*--node-ip=" line: KUBELET_EXTRA_ARGS=--node-ip={{ node_ip }} create: yes register: kubeletconfig - name: Restart kubelet service: name: kubelet daemon_reload: yes state: restarted when: kubeletconfig.changed handlers: - name: docker status service: name=docker state=started ------------------------------------ #在任一节点执行即可 #下载项目 [root@ubuntu ~]#git clone https://github.com/iKubernetes/learning-k8s.git [root@ubuntu ~]#cd learning-k8s-master/ansible-k8s-install/ #修改脚本内的ip地址 ~]#vim cluster-install.sh #事先4个节点配置好基于ssh免密认证 [root@ubuntu ~]#apt update #4个节点都先更新下apt [root@ubuntu ~]#bash cluster-install.sh #查看containerd是否安装完成 [root@ubuntu ~]#containerd --version #查看镜像 [root@ubuntu ~]#crictl images [root@ubuntu ~]#crictl ps #查看容器 #查看版本(下面两个方法都行) [root@ubuntu ~]#kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"31", GitVersion:"v1.31.2", [root@ubuntu ~]#kubectl version Client Version: v1.31.2 #3.部署控制平面的第一个节点; #下面为初始化命令样例,不要执行 ~# kubeadm init \ --image-repository=registry.aliyuncs.com/google_containers #会自动下载镜像,速度有点慢 --control-plane-endpoint="kubeapi.magedu.com" \ #客户端使用该地址接入,主节点域名(做好解析) --kubernetes-version=v1.29.2 \ --pod-network-cidr=10.244.0.0/16 \ #与网络插件保持一致 --service-cidr=10.96.0.0/12 \ --token-ttl=0 \ --upload-certs 命令中的各选项简单说明如下: --image-repository:指定要使用的镜像仓库,默认为registry.k8s.io;#需要上外网,可以用阿里镜像 #--image-repository=registry.aliyuncs.com/google_containers 使用阿里镜像(会自动下载镜像,速度有点慢) #第一次速度比较慢,可以手动下载,命令如下 #kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers #如果就想要通过上外网,可以执行如下操作(每个节点都要做) ~]#vim /usr/lib/systemd/system/containerd.service [Service] #https请求进行代理地址(配自己的代理) Environment="HTTPS_PROXY=http://172.29.0.1:8888" #下面的地址不要走代理 Environment="NO_PROXY=127.0.0.0/8,172.17.0.0/16,172.29.0.0/16,10.244.0.0/16,192.168.0.0/16,10.96.0.0/12,magedu.com,cluster.local" ~]#systemctl daemon-reload && systemctl restart containerd --kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同; --pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16,而Cilium的默认值为10.0.0.0/8; --service-cidr 集群内部虚拟网络,Pod统一访问入口。Service的网络地址范围,其值为CIDR格式的网络地址,kubeadm使用的默认为10.96.0.0/12;通常,仅在使用Flannel一类的网络插件需要手动指定该地址; #下面为主节点执行步骤 #先把镜像下载起来 [root@master01 ~]#kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers #初始化,会自动创建证书,认证文件 [root@master01 ~]#kubeadm init --image-repository=registry.aliyuncs.com/google_containers --control-plane-endpoint="kubeapi.magedu.com" --kubernetes-version=v1.31.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --token-ttl=0 --upload-certs #会返回接下来要做什么 [root@master01 ~]#mkdir -p $HOME/.kube #复制认证文件,客户端程序才能和apiserver对接 [root@master01 ~]#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #查看k8s的节点,master01节点为未就绪状态是因为未部署网络插件,网络不可达 [root@master01 ~]#kubectl get nodes NAME STATUS ROLES AGE VERSION master01 NotReady control-plane 9m16s v1.31.2 #以pod形式把网络插件flannel部署到集群上(yml下不了,可以下载好传进去) [root@master01 ~]#kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml namespace/kube-flannel created serviceaccount/flannel created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created #验证方法,查看kubernetes名称空间(名称空间是让pod进行分组的) [root@master01 ~]#kubectl get namespace NAME STATUS AGE default Active 45m kube-flannel Active 2m41s kube-node-lease Active 45m kube-public Active 45m kube-system Active 45m #显示kube-flannel的名称空间下有多少个pod(Init表示正在初始化,正在下载容器) [root@master01 ~]#kubectl get pods -n kube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-5gpt4 0/1 Init:0/2 0 5m58s #ImagePullBackOff:镜像无法拉取,删pod替换yml中的image为国内镜像,或追加containerd的代理 #注意:安装flannel网络插件报错 Failed to check br_netfilter: stat /proc/sys/net/bridge/bridge-nf-call-iptables: no such file or directory #所有节点都要做如下操作 #1)检查内核配置: #确保你的Linux内核支持并启用了br_netfilter模块。你可以通过以下命令来检查模块是否已加载: lsmod | grep br_netfilter #如果没有列出br_netfilter,你需要加载它: modprobe br_netfilter #2)启用net.bridge.bridge-nf-call-iptables和net.bridge.bridge-nf-call-ip6tables: #这些设置需要在内核中启用,并且通常可以通过sysctl来设置: sysctl -w net.bridge.bridge-nf-call-iptables=1 sysctl -w net.bridge.bridge-nf-call-ip6tables=1 #为了在系统重启后保持这些设置,你可以将它们添加到/etc/sysctl.conf文件中: echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf sysctl -p #让br_netfilter模块在每次启动时自动加载 echo "br_netfilter" >> /etc/modules #列出节点,状态为Ready [root@master01 ~]#kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane 14h v1.31.2 #列出default名称空间下的pods [root@master01 ~]#kubectl get pods No resources found in default namespace. #4.将各工作节点加入控制平面的第一个节点创建出的集群; #在3个节点机器上执行提示的kubeadm join #如果看不到了,执行下方命令kubeadm reset, 然后从上面的kubeadm init开始步骤全重走一遍 [root@node01 ~]#kubeadm join kubeapi.magedu.com:6443 --token amhg0a.h2e64dn72jue35bi \ --discovery-token-ca-cert-hash sha256:983eeeb5abb81f7e005c5ba57d57a3b527c8420346423ff7db265da766c9d567 #查看(NotReady是因为要部署node节点上的pod运行起来才行,要等会) [root@master01 ~]#kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane 16m v1.31.2 node01 NotReady <none> 25s v1.31.2 #等待几个节点kube-flannel转成running [root@master01 ~]#kubectl get pods -n kube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-g4bf4 0/1 Init:0/2 0 13m kube-flannel-ds-gdvrr 0/1 Init:0/2 0 16m kube-flannel-ds-lxhfv 0/1 Init:0/2 0 12m kube-flannel-ds-zzcm2 1/1 Running 0 24m #等到节点都reday,表示集群已部署完成 [root@master01 ~]#kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready control-plane 4h33m v1.31.2 node01 Ready <none> 4h16m v1.31.2 node02 Ready <none> 4h13m v1.31.2 node03 Ready <none> 4h13m v1.31.2
简单使用
#创建名称空间blog [root@master01 ~]#kubectl create namespace blog [root@master01 ~]#cd /root/learning-k8s-master/wordpress #在blog名称空间下通过mysql-ephemeral目录下文件创建mysql的pod ]#kubectl apply -f mysql-ephemeral/ -n blog [root@master01 mysql-ephemeral]#kubectl get pods -n blog NAME READY STATUS RESTARTS AGE mysql-654446d68-cxqt4 1/1 Running 0 12m #进入pod内部 [root@master01 mysql-ephemeral]#kubectl exec -it mysql-654446d68-cxqt4 -n blog -- /bin/sh #创建wordpress的pod,wordpress会自动接入mysql [root@master01 wordpress]#kubectl apply -f wordpress-apache-ephemeral/ -n blog #访问入口,里面的地址是service地址,wordpress节点对外暴露的随机端口32541 [root@master01 wordpress]#kubectl get services -n blog NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql ClusterIP 10.106.173.24 <none> 3306/TCP 93m wordpress NodePort 10.111.214.178 <none> 80:32541/TCP 5m42s #显示ip -o wide多显示几个字段 [root@master01 wordpress]#kubectl get pods -n blog -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-654446d68-cxqt4 1/1 Running 0 29m 10.244.1.4 node01 <none> <none> wordpress-bccdbdb74-6jgwg 1/1 Running 0 10m 10.244.3.3 node03 <none> <none> #访问wordpress,任意节点ip都行,端口为对外暴露的32541 http://10.0.0.153:32541/ #不用配置文件部署服务(创建3个节点,名字demoapp,名称空间default可以不写,--image使用镜像) [root@master01 ~]#kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3 -n default [root@master01 ~]#kubectl get pods NAME READY STATUS RESTARTS AGE demoapp-8699b9895b-cnslb 0/1 ContainerCreating 0 8s demoapp-8699b9895b-tp4qd 0/1 ContainerCreating 0 8s demoapp-8699b9895b-txcf2 0/1 ContainerCreating 0 8s #每一个pod的ip地址都可以作为单独的入口来访问
应用编排: 编排一个应用: 1、选择一个合适的工作负载型控制器,创建一个该控制器类型的资源对象; 2、创建一个Service,实现服务发现和负载均衡;
#查看资源类型 ~]#kubectl api-resources
#查看资源群组和版本
~]#kubectl api-versions
API资源规范
apiVersion kind metadata: name namespace spec: specification:规格,期望状态 status: 实际状态(控制器自动管理,不用定义) Controller: 从用户处期望状态的定义 负责执行一系列的操作,完成实际生产过程,生成具体的对象 还要确保status与spec保持一致 consilation loop: 调谐循环(每隔一段时间对比实际和期望是否一致,不一致就去改) #实例如下 [root@master01 ~]#kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES demoapp-8699b9895b-6dl7t 1/1 Running 0 122m 10.244.2.4 node02 <none> <none> demoapp-8699b9895b-cnslb 1/1 Running 1 (129m ago) 17h 10.244.1.7 node01 <none> <none> demoapp-8699b9895b-ld2ss 1/1 Running 0 122m 10.244.3.5 node03 <none> <none> #访问其中一个,端口为80 [root@master01 ~]#curl 10.244.3.5 iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-8699b9895b-ld2ss, ServerIP: 10.244.3.5! #删除其中一个pod [root@master01 ~]#kubectl delete pods demoapp-8699b9895b-ld2ss -n default #控制器发现工作状态不符合期望,会重新请求apiserver,基于定义的pod模板自动生成(ip地址会变) [root@master01 ~]#kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES demoapp-8699b9895b-6dl7t 1/1 Running 0 127m 10.244.2.4 node02 <none> <none> demoapp-8699b9895b-cnslb 1/1 Running 1 (134m ago) 17h 10.244.1.7 node01 <none> <none> demoapp-8699b9895b-ndb9b 1/1 Running 0 36s 10.244.3.7 node03 <none> <none> #下面通过service访问,避免ip变化对访问的干扰 #创建service类型为clusterip,名称为demoapp,前面的80是service端口(负载均衡端口),后面的80是pod的端口 [root@master01 ~]#kubectl create service clusterip demoapp --tcp=80:80 #查看service,上面3个pod通过Selector被选中,自动分配service的ip为10.100.168.36 [root@master01 ~]#kubectl describe service demoapp Name: demoapp Namespace: default Labels: app=demoapp Annotations: <none> Selector: app=demoapp Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.100.168.36 IPs: 10.100.168.36 Port: 80-80 80/TCP TargetPort: 80/TCP Endpoints: 10.244.3.7:80,10.244.2.4:80,10.244.1.7:80 Session Affinity: None Internal Traffic Policy: Cluster Events: <none> #访问service地址,会自动负载均衡(随机调度) [root@master01 ~]#curl 10.100.168.36 iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-8699b9895b-ndb9b, ServerIP: 10.244.3.7! [root@master01 ~]#curl 10.100.168.36 iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-8699b9895b-cnslb, ServerIP: 10.244.1.7! #即使删掉一个节点,后续自动创建的节点也会被自动发现并调度请求过去 #扩容,对deployment的资源类型demoapp扩到6个 [root@master01 ~]#kubectl scale deployment demoapp --replicas=6 [root@master01 ~]#kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES demoapp-8699b9895b-4k7sn 1/1 Running 0 83s 10.244.1.8 node01 <none> <none> demoapp-8699b9895b-5tmp2 1/1 Running 0 83s 10.244.2.6 node02 <none> <none> demoapp-8699b9895b-6dl7t 1/1 Running 0 4h59m 10.244.2.4 node02 <none> <none> demoapp-8699b9895b-7f7gt 1/1 Running 0 83s 10.244.3.8 node03 <none> <none> demoapp-8699b9895b-cnslb 1/1 Running 1 (5h7m ago) 20h 10.244.1.7 node01 <none> <none> demoapp-8699b9895b-ndb9b 1/1 Running 0 172m 10.244.3.7 node03 <none> <none> #service会自动发现并均匀打在在6个上 #自动滚动更新,把demoapp的deployment中容器demoapp改成新的镜像1.1 #会自动启动滚动更新过程,按比例(可以定制) [root@master01 ~]#kubectl set image deployment demoapp demoapp=ikubernetes/demoapp:v1.1 #可以在更新的同时查看更新过程 [root@master01 ~]#kubectl set image deployment demoapp demoapp=ikubernetes/demoapp:v1.1 && kubectl rollout status deployment demoapp