k8s学习

 


第一章 Kubernetes介绍

主要功能

  • 自我修复:一旦某个容器崩溃,能够迅速启动新的容器
  • 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
  • 服务发现:服务可以通过自动发现的形式,找到它所依赖的服务
  • 负载均衡:如果一个服务起了多个容器,能够自动实现请求的负载均衡
  • 版本回退:如果发现新发布的版本有问题,就可以回退到原来版本
  • 存储编排:可以根据容器自动的需求自动创建存储卷

组件说明

一个k8s集群主要由控制节点(master)工作节点(node)组成。

控制节点(master):

  • ETCD: 可信赖的分布式键值存储服务,能够为整个分部署集群存储一些关键的数据,储存k8s集群所有的重要信息(持久化),协助分布式集群的正常运行。

  • ApiServer: 所有服务访问的统一入口,接收用户输入命令,提供认证,授权,API注册和发现等机制。

  • **CrontrollerManager: ** 负责维护集群的状态,比如程序的部署安排,故障检测,自动扩展,滚动更新等。

  • **sheduler: ** 负责集群的调度,选择合适的节点进行分配任务(计算如何调度)。

工作节点node:

  • **Kubelet: ** 直接跟容器引擎交互实现容器的生命周期管理。(工作在node节点,等待接活)

  • **Kube-proxy: ** 负责写入规则至 Iptables, 负载均衡IPVS实现服务映射访问。

image-20210516164838956

以nginx实例来讲解组件间调用关系:

  1. 首先,一旦k8s环境启动后,master和node都会将自身的信息存储到etcd数据库中
  2. 一个nginx服务的安排请求会首先被发送到master节点的apiServer组件
  3. apiServer组件会调用scheduler组件来决定应该把服务安装到那个节点node上,在此时,scheduler会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
  4. 此时apiServer调用controller-manager去调度Node节点进行安装nginx服务
  5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod, pod是k8s的最小操作单元,容器必须跑在pod中。
  6. nginx就运行了,如果想要访问nginx,需要kube-proxy来产生访问代理,这样外界就可以访问集群中的nginx了。

其他组件:

  • **CoreDNS: ** 可以为集群中的SVC创建一个域名IP的对应关系解析

  • DASHBOARD: 给K8S提供一个B/S访问体系

  • **INGRESS CONTROLLER: ** 官方只能实现四层代理,Ingress 实现七层代理

  • **FEDETATION: ** 提供一个可以跨集群中心多K8S统一管理功能

  • **PROMETHEUS: ** 提供K8S集群的监控能力

  • **ELK: ** 提供k8s集群日志统一分析介入平台

注意:

  • 高可用集群副本最好是大于等于3的奇数个。

k8s的概念介绍

master: 集群控制节点,每个集群至少一个master节点负责集群的管控

**node: ** 工作负载节点,由master节点分配,然后node节点上的docker负责容器的运行

**Pod: ** k8s的最小控制单元,容器都是运行在pod中的,一个pod可以有一个或多个容器

**Controller: ** 控制器,通过它来实现对pod的管理,比如启动pod,停止pod,伸缩pod的数量等。

Service: Pod对外服务的统一入口,维护多个pod。

Label: 标签,用于对pod进行分类,同一类的pod会有相同的标签

NameSpace: 命名空间,来隔离pod的运行环境。

第二章 集群环境搭建

环境规划

安装方式

  • minikube: 一个用于快速搭建单节点k8s的工具
  • kubeadm:一个用于快速搭建k8s集群的工具
  • 二进制包:从官网下载每个组件的二进制包,依次安装

主机: centos7 * 3 , 一主两从,kubeadm安装

环境初始化

# 配置hosts
vim /etc/hosts

# 添加以下
192.168.0.115 master
192.168.0.117 node2
192.168.0.118 node3

# 时间同步(三台机器)
# k8s要求集群中节点时间必须精确一致,这里使用chronyd来从网络同步时间
systemctl start chronyd
systemctl enable chronyd
date

# 禁用iptables和firewalld服务
systemctl stop iptables
systemctl disable iptables
systemctl stop firewalld
systemctl disable firewalld

# 禁用selinux
vim /etc/selinux/config

SELINUX=disabled

# 禁用swap交换分区
swapoff -a         # 临时禁用swap
vim /etc/fstab     # 永久关闭,打开自动挂载的配置文件,将swap配置项注释掉
"""
# /dev/mapper/cl-swap     swap                    swap    defaults        0 0
"""

free -m   		   # 验证

# 修改linux内核参数,添加网桥过滤和地址转发功能
vim /etc/sysctl.d/kubernetes.conf

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter

# 配置ipvs功能
# 在k8s中service有两种代理模型,一种是基于iptables,一种基于ipvs,
# 两者比较,ipvs性能更好,但需要手动载入ipvs模块
# 1)安装ipset和ipvsadm
yum install ipset ipvsadmin -y
# 2)添加需要加载模块写入脚本文件
vim /etc/sysconfig/modules/ipvs.modules
"""
#!bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
"""
# 3)为脚本添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4) 执行并查看是否模块加载成功
/bin/bash /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

# 重启服务器
reboot

安装docker和k8s

# 安装docker, yum安装即可
# 修改配置文件
{
    "exec-opts":["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://0gsacrb1.mirror.aliyuncs.com/"]
}

# 重启
systemctl restart docker

# 安装k8s
# 1. 换源
vim /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
"""

# 2. 安装kubeadm, kubelet和kubectl
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubectl-1.17.4-0 kubelet-1.17.4-0 -y

# 3. kubelet的cgroup
vim /etc/sysconfig/kubelet
"""
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
"""
# 4. 设置kubelet开机启动
systemctl enable kubelet

安装k8s的集群(组件)

# 准备集群镜像
# 在安装k8s集群之前,需要提前准备好集群需要的镜像,所需镜像通过下面命令查看
kubeadm config images list 

# 下载镜像(需要ke学上网)
# 这里是一种替代方案, 复制到shell执行
images=(
	kube-apiserver:v1.17.4
	kube-controller-manager:v1.17.4
	kube-scheduler:v1.17.4
    kube-proxy:v1.17.4
    pause:3.1
    etcd:3.4.3-0
    coredns:1.6.5
)
for imageName in ${images[@]} ; do
	docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
	docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
	docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done


# 安装k8s镜像
# 在master节点执行
kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.0.115

# 创建必要的文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 查看节点, 只有master节点
kubectl get nodes
# 在node节点执行
kubeadm join 192.168.0.115:6443 --token q4z6tz.91bti4zjtm1ssff5 \
    --discovery-token-ca-cert-hash sha256:b85860a0a81c935f2c510a518a93919418bc9fc8c96105d146e65dfcd53b75fa

# 在master节点,查看节点,但状态是noready,需要安装网络插件
kubectl get nodes

# node节点退出集群(1. 在master删除)
kubectl  delete nodes node2
# 2. 在node节点 reset
kubeadm reset

# 重新生成加入集群token
kubeadm token create --print-join-command

安装网络插件

k8s的网络插件,支持多种,比如flannel,calico,canal等等,这里选择flannel

# 下面操作只需要在master节点,插件使用daemonSet控制器,会在每个节点都运行

# 获取fannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 修改配置文件中quay.io仓库为 quay.mirror.qiniu.com,

# 使用配置文件启动fannel
kubectl apply -f kube-flannel.yml

# 稍等,查看节点的状态
kubectl get nodes
"""
NAME     STATUS     ROLES    AGE    VERSION
master   Ready      master   3h9m   v1.17.4
node2    Ready   <none>   166m   v1.17.4
node3    Ready      <none>   3h5m   v1.17.4
"""
# 此时集群搭建完成

实战:服务部署nginx

# 一下操作在master操作
# 部署nginx
kubectl create deployment nginx --image=nginx:1.14

# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看服务
kubectl get pods,svc  # 参看pods和service
"""
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-6c748d4965-lg5tj   1/1     Running   0          95s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        9m48s
service/nginx        NodePort    10.98.52.168   <none>        80:32699/TCP   75s
"""
# 最后访问部署的nginx服务
curl 192.168.0.115:32599

第三章 资源管理

资源管理介绍

在k8s中,所有的内容都抽象为资源,用户需要通过操作资源来管理k8s。

k8s的本质就是一个集群系统,用户可以在集群中部署各种服务,所有的部署服务,就在在k8s中运行一个个的容器,并将制定的程序跑在容器中。

k8s的最小的管理单元是pod而不是 容器,所以只能将容器放在pod中,而k8s也不会直接管理pod,而是有Pod控制器来管理Pod。

Pod可以提供服务之后,就要考虑如何访问Pod中的服务,k8s通过Service资源,实现这个功能。

此外k8s还提供了各种存储系统,以为了Pod中的数据需要持久化。

image-20210516230539680

YAML语法介绍

语法:

  • 大小写敏感
  • 使用缩进表示层级
  • #表示注释
  • :后加空格
  • --- 一个文件,两个配置

实例:

person:
	name: zs
	age: 29
	car:
		- baom
		- benc
---
person:
	name: lisi

资源管理方式

三种方式:

  • 命令式对象管理(用于测试环境): 直接使用命令【这里的run】去操作k8s的资源

    实例:kubectl run nginx-pod --image=nginx:1.14 --port=80

  • 命令式对象配置: 通过命令【这里的create】配置 和 配置文件去操作k8s的资源 (命令+配置文件)

    实例: kubectl create -f nginx-pod.yml

  • 声明式对象配置: 通过apply命令【apply只用于创建和更新资源】和配置文件去操作k8s的资源

    实例:kubectl apply -f nginx-pod.yml

命令式对象管理

kubectl是k8s集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用部署,kubectl命令格式如下:

kubectl [command] [type] [name] [flags]

command: 指定要对资源执行的操作,例如create、get、delete、expose、run
type: 指定资源类型。 比如deployment, pod, service
name: 指定资源的名称,大小写敏感
flags: 指定额外的可选参数

实例:
kubectl get pods   # 查看所有pod
kubectl get pod pod_name   # 查看指定pod
kubectl get pod pod_name -o yaml  # 以yaml形式展示结果
kubectl get pod pod_name -o wide  # 详细查看
kubectl get pod pod_name -o json  # json形式查看

command 常用命令

# 基本命令  
kubectl create      # 创建一个资源
kubectl edit        # 编辑一个资源 
kubectl get         # 获取一个资源
kubectl patch       # 更新资源
kubectl delete      # 删除资源
kubectl explain     # 查询资源文档   # 例如:kubectl explain pod ;   kubectl explain pod.metadata

# 运行和调试命令
kubectl run         # 在集群中运行指定的镜像
kubectl expose      # 暴露资源为service
kubectl describe    # 显示资源内部信息
kubectl logs        # 输入容器在Pod的日志
kubectl attach      # 进入运行中的容器
kubectl exec        # 执行容器中一个命令
kubectl cp          # 在pod内外复制文件
kubectl rollout     # 管理资源的发布
kubectl scale       # 扩缩容
kubectl autoscale   # 自动调整pod的数量


# 高级命令
kubectl apply        # 通过文件对资源进行配置
kubectl label        # 更新资源上的标签

# 其他命令
kubectl cluster-info  # 集群信息 
kubectl version       # 版本

type类型

# 集群级别
kubectl xx nodes          # 集群组成部分
kubectl xx namespace(ns)  # 命名空间
kubectl xx pods           # 装载容器

# pod资源控制器
kubectl xx replicationcontrollers(rc)   # 控制Pod资源
kubectl xx replicasets(rs)              # 控制pod资源
kubectl xx deployments(deploy)         # 控制pod资源
kubectl xx daemonsets(ds)              # 控制pod资源
kubectl xx jobs                        # 控制pod资源
kubectl xx cronjobs(cj)                    # 控制pod资源
kubectl xx horizontalpodautoscalers(hpa)   # 控制pod资源
kubectl xx statefulsets(sts)                # 控制pod资源

# 服务发现资源
kubectl xx services(svc)   # 统一pod对外接口
kubectl xx ingress(ing)    # 统一pod对外接口

# 存储资源
kubectl xx volumeattachments    # 存储
kubectl xx persistentvolumes(pv)  # 存储
kubectl xx persistentvolumeclaims(pvc)  # 存储

# 配置资源
configmaps(cm)   # 配置
secrets          # 配置

实例:

# 创建一个namespace
kubectl create ns dev
# 查看创建的名为dev的ns
kubectl get ns
"""
NAME              STATUS   AGE
default           Active   52m
dev               Active   4s
kube-node-lease   Active   52m
kube-public       Active   52m
kube-system       Active   52m
"""

# 在集群上运行一个指定镜像
kubectl run pod --image=nginx:1.17.1 -n dev   # -n 参数指定命名空间,推荐使用create创建

# 查看在指定命名空间的pods
kubectl get pods -n dev
# 详细信息
kubectl describe pod pod-cbb995bbf-fnxxz -n dev

# 删除pod
kubectl delete pod pod-cbb995bbf-fnxxz -n dev

# 删除命名空间
kubectl delete ns dev

命令式对象配置

使用命令+配置文件来操作k8s的资源

# 1) 创建nginxpod.yml文件
"""
apiVersion: v1
kind: Namespace
metadata:
    name: dev

---

apiVersion: v1
kind: Pod
metadata:
    name: mydev
spec:
    containers:
        - name: nginx-containers
          image: nginx:1.17.1
"""

# 2) 执行create命令创建资源
kubectl create -f nginxpod.yml  # 此时创建两个资源对象,分别为ns和pod

# 3) 查看资源
kubectl get -f nginxpod.yml
"""
NAME            STATUS   AGE
namespace/dev   Active   49s

NAME      READY   STATUS    RESTARTS   AGE
pod/mydev   1/1     Running   0          49s
"""

# 4) 删除资源
kubectl delete -f nginxpod.yml

声明式对象配置

通过apply命令【apply只用于创建和更新资源】 + 配置文件操作k8s的资源

# 1) 创建资源
kubectl apply -f nginxpod.yml
# 2) 在一次执行,发现资源没有变动
kubectl apply -f nginxpod.yml
"""
namespace/dev unchanged
pod/mydev unchanged

"""

# 3) 此时改动nginxpod.yml的nginx版本为1.17.2,然后查看详细信息
kubectl describe pod mydev
"""
  Type    Reason     Age                  From               Message
  ----    ------     ----                 ----               -------
  Normal  Scheduled  2m12s                default-scheduler  Successfully assigned default/mydev to node3
  Normal  Pulled     2m10s                kubelet, node3     Container image "nginx:1.17.1" already present on machine
  Normal  Killing    38s                  kubelet, node3     Container nginx-containers definition changed, will be restarted
  Normal  Pulling    38s                  kubelet, node3     Pulling image "nginx:1.17.2"
  Normal  Created    10s (x2 over 2m10s)  kubelet, node3     Created container nginx-containers
  Normal  Started    10s (x2 over 2m10s)  kubelet, node3     Started container nginx-containers
  Normal  Pulled     10s                  kubelet, node3     Successfully pulled image "nginx:1.17.2"

"""

问题:

  • 如果已经创建,再次执行kubectl create 则会报错

  • kubectl 可以在node节点执行吗

    答:kubectl运行在node节点需要进行配置,配置文件在$HOME/.kube,如果想要在node节点执行,需要将配置文件复制到node节点,即scp -r ~/.kube node1:~/,此时node就可以像master一样执行命令。

使用推荐

  • 创建/更新资源: 使用声明式对象配置kubectl apply -f xx.yml
  • 删除资源: 使用命令式对象配置kubectl delete -f xx.yml
  • 查询资源:使用命令式对象管理kubectl get(describe) 资源名称

第四章 实战

Namespace命名空间

Namespace 是k8s系统中非常重要的资源,主要作用是实现多套环境的资源隔离。

# 查看所有命名空间
kubectl get ns

# namespace包含两种状态”Active”和”Terminating”。
# 在namespace删除过程中,namespace状态被设置成”Terminating
"""
NAME              STATUS   AGE
default           Active   146m      # 所有未指定ns的对象会被分配到default命名空间
kube-node-lease   Active   147m      # 集群节点之间的心跳维护, v1.13开始引用
kube-public       Active   147m      # 此命名空间下的资源可以被所有人访问,(包括未认证用户)
kube-system       Active   147m      # 所有k8s系统创建的资源都处于这个命名空间
"""

# 查看指定的ns
kubectl get ns ns名称
例如:kubectl get ns default

# 指定输出格式
kubectl get ns ns名称 -o 格式参数   # 创建格式wide,json, yaml
例如:kubectl get ns default -o json

# 查看ns的详情
kubectl describe ns default

# 创建ns
kubectl create ns mydev

# 删除
kubectl delete ns mydev

以yml文件方式配置

# ns-dev.yml文件
"""
apiVersion: v1
kind: Namespace   # 注意k8s区分大小写
metadata:
    name: mydev1
"""

#创建资源
kubectl create -f ns-dev.yml

# 删除资源
kubectl delete -f ns-dev.yml

注意:

  • 删除一个namespace会自动删除所有属于该namespace的资源。

Pod

pod是k8s集群中管理的最小单元,程序运行时必须部署在容器中,而容器在pod中,一个pod可以是一个或多个容器。

# k8s启动集群后,集群的各个组件也是以Pod的方式运行的。
kubectl get pod -n kube-system
"""
NAME                             READY   STATUS    RESTARTS   AGE
coredns-6955765f44-br5vv         1/1     Running   0          179m
coredns-6955765f44-zhklb         1/1     Running   0          179m
etcd-master                      1/1     Running   0          3h
kube-apiserver-master            1/1     Running   0          3h
kube-controller-manager-master   1/1     Running   0          3h
kube-proxy-9f7dm                 1/1     Running   0          179m
kube-proxy-dv7zz                 1/1     Running   0          179m
kube-proxy-r4l7w                 1/1     Running   0          179m
kube-scheduler-master            1/1     Running   0          3h
"""

#  创建并运行
# k8s中没有单独运行pod的命令,而是通过pod控制器来实现的
kubectl run pod控制器名 [参数]
-- image 镜像
-- port 指定端口
--namespace 指定命名空间

例如:kubectl run mynginx --image=nginx:1.17.1 --port=80 --namespace dev

# 查看pods
kubectl get pods -n dev
““”
NAME                     READY   STATUS    RESTARTS   AGE
nginx-64777cd554-cdgb8   1/1     Running   0          9s
“”“
# 删除pod
kubectl delete pod nginx-64777cd554-cdgb8 -n dev

# 但pod控制器会重新创建,
kubectl get pods -n dev
"""
nginx-64777cd554-czhfr
"""
# 只能通过删除pod控制器,pod自动被删除
kubectl delete deployment nginx -n dev

# 删除所有的pods(如果是通过yml文件只创建的pod,)
kubectl delete pods --all

以yml文件形式创建

# pod-nginx.yml

apiVersion: v1
kind: Pod
metadata:
    name: nginx  # Pod的名称,以yml文件可以直接创建pod
    namespace: dev
spec:
    containers:
    - image: nginx:1.17
      imagePullPolicy: IfNotPresent
      name: pod
      ports:
      - name: nginx-port
        containerPort: 80
        protocol: TCP

# 创建和删除
kubectl create -f pod-nginx.yml
kubectl delete -f pod-nginx.yml

Label

label的作用是在资源上添加标识用于进行区分和选择

特点:

  • 一个Label以key/value的键值对的形式附加到各种对象上,例如:Node,Pod,Service等。
  • 一个资源对象可以定义任意个数的Label,同一个Label也可以添加到任意个资源对象上。
  • Label通常在资源对象建立的时候确定,当然也可以在创建后动态添加和删除
  • Label通过在资源对象的过维度分组,以便灵活,方便的进行资源分配部署等。

常用的Label实例:

# 版本标签
version: "release"    version: "stable"

# 环境标签
environment: "dev"   environment: "test" environment: "pro"

# 架构标签
tier: "frontend"   tier: "backend"

当标签定义完后,需要考虑标签的选择,就要使用到标签的选择器Label selector

当前有两种:

  • 基于等式的Label Selector

    name=slave: 选择所有标签中包含的key=name, 且value=slave的对象

    env!=producation:选择所有标签中包含的key=env,value不等于producation的对象

  • 基于集合的Label Selector

    name in (master, slave) : 选择Label中key为name,value为master或slave的对象

    name not in (frontend) : 选择Label中key为name, value 不为frontend的对象

注意:

  • 标签选择器可以使用多个,使用逗号分隔。

    name=slave, env!=production

# 查看pod标签
kubectl get pods --show-labels
"""
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
mydev                    1/1     Running   1          146m    <none>
nginx-6c748d4965-lg5tj   1/1     Running   0          3h42m   app=nginx,pod-template-hash=6c748d4965
"""

# 给pod打标签
kubectl label pod mydev version=1.0  # 打个version=1.0的标签

# 相同标签,标签的更新
kubectl label pod mydev version=2.0 --overwrite

# 标签的筛选
kubectl get pods -l "version=1.0" --show-labels

# 删除标签(删除version)后面跟-号
kubectl label pod mydev version-

以yml方式配置

# labels-nginx.yml

apiVersion: v1
kind: Pod
metadata:
    name: nginx  # Pod的名称,以yml文件可以直接创建pod
    namespace: dev
    labels:
        version: "3.0"
        env: "test"
spec:
    containers:
    - image: nginx:1.17
      imagePullPolicy: IfNotPresent
      name: pod
      ports:
      - name: nginx-port
        containerPort: 80
        protocol: TCP

# 创建和删除
kubectl create -f labels-nginx.yml
kubectl delete -f labels-nginx.yml

Deployment

k8s中,一般通过pod控制器来管理pod。pod控制器管理Pod,来确保Pod的资源符合预期的状态,当Pod的资源出现故障时,会尝试重启或重建Pod。

deployment是一种Pod的控制器。

image-20210517235340451

常用命令:

kubectl run depoyment名称 [参数]
--image 指定pod镜像
--port 指定端口
--replicas 指定副本数
--namespace  指定ns

实例:
kubectl run mynginx --image=nginx:1.17.1 --port=80 --replicas=3 -n dev  # 创建的是deployment控制器,

kubectl get pods -n dev --show-labels   # 通过标签一致来确定管理的哪些pods
"""      
NAME                       READY   STATUS    RESTARTS   AGE    LABELS
mynginx-55654cbb9d-72vkd   1/1     Running   0          2m9s   pod-template-hash=55654cbb9d,run=mynginx
mynginx-55654cbb9d-b7ttw   1/1     Running   0          2m9s   pod-template-hash=55654cbb9d,run=mynginx
mynginx-55654cbb9d-f9hwx   1/1     Running   0          2m9s   pod-template-hash=55654cbb9d,run=mynginx
"""

# 删除deployment,对应的pod也自动删除
kubectl delete deployment mynginx -n dev

以下yml文件配置

apiVersion: apps/v1    # ?
kind: Deployment
metadata:
    name: nginx
    namespace: dev
spec:
    replicas: 3             # 副本数
    selector:
        matchLabels:         # 根据标签匹配deployment和pod
            run: nginx
    template:                # 创建的Pod模板
        metadata:
            labels:
                run: nginx
        spec:
            containers:
            - image: nginx:1.17
              name: nginx
              ports:
                - containerPort: 80
                  protocol: TCP

# 创建和删除
kubectl create -f deployment-nginx.yml
kubectl delete -f deployment-nginx.yml

Service

虽然每个Pod都会分配一个单独的ip,然后却会出现两个问题:

  • Pod的ip会随着Pod的重建产生变化
  • Pod 的ip仅仅是集群里可见的虚拟Ip, 外部无法访问。

故k8s通过service服务来解决这个问题.

Service可以看成一组同类Pod对外访问接口。借助Service可以方便的实现服务发现和负载均衡。

Service在生命周期中Ip地址都不会变,请求过来到服务Service的ip,然后转发到Pod上。

实例:

# 创建集群内部可以访问的service
kubectl expose deployment nginx --name=nginx --type=ClusterIP --port=80 --target-port=80 -n dev  # --target-port 转发到80   type=ClusterIP 只能在集群内部执行,   type=NodePort  可以在集群外部也能访问

# 类型为NodePort的service
kubectl expose deployment nginx --name=nginx-nodeport --type=NodePort --port=80 --target-port=80 -n dev  # --name 为service起名

# 查看service
kubectl get svc -n dev
"""
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx            ClusterIP   10.99.43.122     <none>        80/TCP         31m
nginx-nodeport   NodePort    10.104.207.222   <none>        80:31589/TCP   2m30s

"""
# 本机浏览器访问
http://192.168.0.115:32589/

# 服务删除
kubectl delete service(svc) nginx-noreport -n dev

使用配置方式

# svc-nginx.yml

apiVersion: v1
kind: Service
metadata:
    name: svc-nginx
    namespace: dev
spec:
    clusterIP: 10.109.179.231  # 可写可不写,如果写为指定的ip,不写随机分配
    ports:
    - port: 80
      protocol: TCP
      targetPort: 80
    selector:
        run: nginx   # label
    type: ClusterIP

# 然后执行
kubectl create -f svc-nginx.yml
kubectl delete -f svc-nginx.ym,l

第五章 Pod详解

介绍Pod资源的各种配置(yaml文件编写)和原理。

Pod介绍

Pod结构

每个pod都可以包含一个或多个容器,这些容器分为两类,

  • 用户程序所在的容器,数量可多可少
  • Pause容器,这是每个Pod都会有的一个根容器,作用有两个:
    • 可以提供依据,评估整个Pod的健康状态
    • 可以在根容器上设置IP地址,其他容器都以这个ip(Pod ip),以实现Pod内部的网络通信。【这里是pod内部通信。而pod之间的通信是采用虚拟二层网络技术来实现,我们当前使用的是flannel】

Pod定义

实例:下面是Pod的资源清单

apiVersion: v1
kind: Pod
metadata:
   

注意:

  • 在k8s中基本所有资源的一级属性都是一样的,主要包含下面部分:

    apiVersion: <string>     # 版本, 版本号必须可以通过kubect api-versions可以查到
    kind: <stirng>           # 资源类型,必须为kubectl api-resources 可以查到
    metadata: <object>       # 元数据,只要是资源表示和说明,常用的有:name, namespace, labels
    spec: <object>           # 各种资源的详细描述
    status: <object>         # 状态信息,不需要定义,自动生成
    
  • 一级属性之下的二级属性:

    
    

Pod配置

Pod的生命周期

第六章

posted @   学习记录13  阅读(240)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示