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:作业类应用

 

1 部署Kubernetes集群

部署集群:
    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    #要自己安装

kubeadm

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地址都可以作为单独的入口来访问

 

3应用编排快速入门

应用编排:
    编排一个应用:
        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

 

posted @ 2024-11-17 16:09  战斗小人  阅读(5)  评论(0编辑  收藏  举报