Kubernetes对外暴露与应用

导读:本篇文章讲解 Kubernetes对外暴露与应用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、Service

1.1 Service简介

Kubernetes Service定义了这样一种抽象:逻辑上的一组 Pod,一种能够访问它们的策略 —— 一般被称为微服务。这一组 Pod 可以被 Service 访问到,一般是经过 selector实现的。

举例:考虑一个图片处理 backend,它运行了3个副本。这些副本是可互换的 —— frontend 不需要关心它们调用了哪一个 backend 副本。 然而组成这一组 backend 程序的 Pod 实际上可能会发生变化,frontend 客户端不必知道,并且也不需要跟踪这一组 backend 的状态。Service 定义的抽象可以解耦这种关联。

Service能够提供负载均衡的能力,可是使用上存在以下限制:

  • 只能提供4层负载均衡能力,而没有7层功能。有时咱们可能须要更多的匹配规则来转发请求,这点上4层负载均衡是不支持的、
    如web访问的service服务示例图:

在这里插入图片描述

1.2 VIP和Service代理

在 Kubernetes 集群中,每一个 Node 运行一个 kube-proxy 进程。kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)的形式,而不是 ExternalName 的形式。后端

从Kubernetes v1.0开始,已经可使用 userspace代理模式。Kubernetes v1.1添加了 iptables 代理模式,在 Kubernetes v1.2 中kube-proxy 的 iptables 模式成为默认设置。Kubernetes v1.8添加了 ipvs 代理模式。

1.3 不使用 DNS 轮询的原因

缘由以下:

  • DNS 实现的历史由来已久,它不遵照记录 TTL,而且在名称查找到结果后会对其进行缓存。

  • 有些应用程序仅执行一次 DNS 查找,并没有限期地缓存结果。

  • 即便应用和库进行了适当的从新解析,DNS 记录上的 TTL 值低或为零也可能会给 DNS 带来高负载,从而使管理变得困难。

由于有缓存,所以不合适。

1.4 iptables 代理模式

这种模式,kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。 对每一个 Service,它会配置 iptables 规则,从而捕获到达该 Service 的 clusterIP 和端口的请求,进而将请求重定向到 Service 的一组 backend 中的某个上面。对于每一个 Endpoints 对象,它也会配置 iptables 规则,这个规则会选择一个 backend 组合。

默认的策略是,kube-proxy 在 iptables 模式下随机选择一个 backend。

使用 iptables 处理流量具备较低的系统开销,由于流量由 Linux netfilter 处理,而无需在用户空间和内核空间之间切换。 这种方法也可能更可靠。

若是 kube-proxy 在 iptables模式下运行,而且所选的第一个 Pod 没有响应,则链接失败。 这与userspace模式不一样:在这种状况下,kube-proxy 将检测到与第一个 Pod 的链接已失败,并会自动使用其余后端 Pod 重试。

咱们可使用 Pod readiness 探测器 验证后端 Pod 是否能够正常工做,以便 iptables 模式下的 kube-proxy 仅看到测试正常的后端。这样作意味着能够避免将流量经过 kube-proxy 发送到已知已失败的Pod。

在这里插入图片描述

1.5 IPVS 代理模式

在 ipvs 模式下,kube-proxy监视Kubernetes服务(Service)和端点(Endpoints),调用 netlink 接口相应地建立 IPVS 规则, 并按期将 IPVS 规则与 Kubernetes服务(Service)和端点(Endpoints)同步。该控制循环可确保 IPVS 状态与所需状态匹配。访问服务(Service)时,IPVS 将流量定向到后端Pod之一。

IPVS代理模式基于相似于 iptables 模式的 netfilter 挂钩函数,可是使用哈希表做为基础数据结构,而且在内核空间中工做。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通讯的延迟要短,而且在同步代理规则时具备更好的性能。与其余代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。

IPVS提供了更多选项来平衡后端Pod的流量。分别是:

  • rr: round-robin
  • lc: least connection (smallest number of open connections)
  • dh: destination hashing
  • sh: source hashing
  • sed: shortest expected delay
  • nq: never queue

注意: 要在 IPVS 模式下运行 kube-proxy,必须在启动 kube-proxy 以前使 IPVS Linux 在节点上可用。 当 kube-proxy 以 IPVS 代理模式启动时,它将验证 IPVS 内核模块是否可用。 若是未检测到 IPVS 内核模块,则 kube-proxy 将退回到以 iptables 代理模式运行。
在这里插入图片描述

二、Service存在的意义

service引入主要是解决Pod的动态变化,提供统一访问入口:

  • 防止Pod失联,准备找到提供同一个服务的Pod(服务发现)
  • 定义一组Pod的访问策略(负载均衡)

在这里插入图片描述

在这里插入图片描述

Pod与Service的关系:

  • Service通过标签关联一组Pod
  • Service使用iptables或者ipvs为一组Pod提供负载均衡能力

在这里插入图片描述

三、Service定义与创建

创建service:

  • kybectl apply -f service.yaml

查看service:

  • kubectl get service

实例:

[root@master ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED        SIZE
gaofan1225/httpd                                                  v0.2      f61bbd041ba4   12 days ago    89.2MB


[root@master ~]# cat test.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: httpd
  namespace: default
spec: 
  selector: 
    matchLabels: 
      name: httpd
  template: 
    metadata: 
      labels: 
        name: httpd
    spec: 
      containers: 
      - name: httpd
        image: gaofan1225/httpd:v0.2
        imagePullPolicy: IfNotPresent
        
// 应用        
[root@master ~]# kubectl apply -f test.yaml 
deployment.apps/httpd created

[root@master ~]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
httpd-77bfff888c-4bfzv   1/1     Running     0          8s

// 暴露端口,本机访问映射端口80,容器内访问映射端口80
[root@master ~]# kubectl expose deployment httpd --port 80 --target-port 80
service/httpd exposed

// svc创建成功
[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
httpd        ClusterIP   10.105.163.84   <none>        80/TCP    5s
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   3d23h

// 测试访问
[root@master ~]# curl 10.105.163.84:80
<html><body><h1>It works!</h1></body></html>

四、Service服务类型

4.1 ClusterIP:集群内部使用

默认类型,自动分配一个仅Cluster内部能够访问的虚拟IP
在这里插入图片描述
实例:

[root@master ~]# cat test3.yaml 
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: mydeploy
  namespace: default
spec: 
  replicas: 2
  selector: 
    matchLabels: 
      app: amu2
      release: v1
  template: 
    metadata: 
      labels: 
        app: amu2
        release: v1
    spec: 
      containers: 
      - name: amu2
        image: gaofan1225/httpd:v0.2
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata: 
  name: mysvc
  namespace: default
spec: 
  type: ClusterIP			// 指定ClusterIP类型
  selector: 
    app: amu2
    release: v1
  ports: 
  - name: httpd
    port: 80
    targetPort: 80

[root@master ~]# kubectl apply -f test3.yaml 
deployment.apps/mydeploy created
service/mysvc created


// 查看pod、svc
[root@master ~]# kubectl get pods,svc
NAME                            READY   STATUS    RESTARTS      AGE
pod/httpd-77bfff888c-4bfzv      1/1     Running   1 (21h ago)   24h
pod/mydeploy-8677d9777f-5tscj   1/1     Running   0             73s
pod/mydeploy-8677d9777f-bbdg2   1/1     Running   0             73s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/httpd        ClusterIP   10.105.163.84   <none>        80/TCP    23h
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   4d23h
service/mysvc        ClusterIP   10.108.80.46    <none>        80/TCP    73s

// 查看iptables规则
[root@master ~]# iptables -t nat -nvL | grep 'mysvc'
    0     0 KUBE-SVC-6JLCTYIGOFR3CPYO  tcp  --  *      *       0.0.0.0/0            10.108.80.46         /* default/mysvc:httpd cluster IP */ tcp dpt:80
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.233         0.0.0.0/0            /* default/mysvc:httpd */
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ tcp to:10.244.1.233:80
    0     0 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.108.80.46         /* default/mysvc:httpd cluster IP */ tcp dpt:80
    0     0 KUBE-SEP-4VFABQEMANK3FANL  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ statistic mode random probability 0.50000000000
    0     0 KUBE-SEP-HUIUEWW2ZETD3L7Q  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.2.230         0.0.0.0/0            /* default/mysvc:httpd */
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ tcp to:10.244.2.230:80

// 访问测试
[root@master ~]# curl 10.108.80.46 
<html><body><h1>It works!</h1></body></html>

4.2 NodePort:对外暴露应用(集群外)

在每个节点上启用一个端口来暴露服务,可以在集群外部访问。也会分配一个稳定内部集群Ip地址。

访问地址:<任意NodeIP>:

端口范围: 30000-32767

实例:

[root@master ~]# cat test3.yaml 
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: mydeploy
  namespace: default
spec: 
  replicas: 2
  selector: 
    matchLabels: 
      app: amu2
      release: v1
  template: 
    metadata: 
      labels: 
        app: amu2
        release: v1
    spec: 
      containers: 
      - name: amu2
        image: gaofan1225/httpd:v0.2
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata: 
  name: mysvc
  namespace: default
spec: 
  type: NodePort		// 指定NodePort类型
  selector: 
    app: amu2
    release: v1
  ports: 
  - name: httpd
    port: 80
    targetPort: 80
    nodePort: 30010		// 指定对外端口

// 应用
[root@master ~]# kubectl apply -f test3.yaml 
deployment.apps/mydeploy unchanged
service/mysvc configured


// 查看pod、svc
[root@master ~]# kubectl get pods,svc
NAME                            READY   STATUS    RESTARTS   AGE
pod/mydeploy-8677d9777f-rtsvj   1/1     Running   0          2m3s
pod/mydeploy-8677d9777f-x82lr   1/1     Running   0          2m3s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        5d
service/mysvc        NodePort    10.102.201.192   <none>        80:30010/TCP   2m3s

// 查看svc
[root@master ~]# iptables -t nat -nvL | grep 'mysvc'
    0     0 KUBE-SVC-6JLCTYIGOFR3CPYO  tcp  --  *      *       0.0.0.0/0            10.102.201.192       /* default/mysvc:httpd cluster IP */ tcp dpt:80
    0     0 KUBE-SVC-6JLCTYIGOFR3CPYO  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ tcp dpt:30010
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.2.234         0.0.0.0/0            /* default/mysvc:httpd */
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ tcp to:10.244.2.234:80
    0     0 KUBE-MARK-MASQ  tcp  --  *      *      !10.244.0.0/16        10.102.201.192       /* default/mysvc:httpd cluster IP */ tcp dpt:80
    0     0 KUBE-MARK-MASQ  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ tcp dpt:30010
    0     0 KUBE-SEP-PPFDTCIODWKWE3OD  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ statistic mode random probability 0.50000000000
    0     0 KUBE-SEP-S345OYQTNRQLEEUI  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */
    0     0 KUBE-MARK-MASQ  all  --  *      *       10.244.1.237         0.0.0.0/0            /* default/mysvc:httpd */
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/mysvc:httpd */ tcp to:10.244.1.237:80

// 访问测试,本机IP
[root@master ~]# curl 192.168.91.138:30010
<html><body><h1>It works!</h1></body></html>

注意: NodePort对外端口范围是30000-32767

NodePort:会在每台Node上监听端口接受用户流量,在实际情况下,对用户暴露的只会有一个IP和端口,那这么多台Node该使用哪台让用户访问呢?

这时就需要前面加一个公网负载均衡器为项目提供统一访问入口了。

在这里插入图片描述

4.3 LoadBanlancer:对外暴露应用,适用于公有云

LoadBalancer:与NodePort类型,在每个节点上启用一个端口来暴露服务。除此之外,Kubernetes会请求底层云平台(例如阿里云、腾讯云、AWS等)上的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加进去。

在这里插入图片描述

4.4 ExternalName类型示例

ExternalName:经过返回 CNAME 和它的值,能够将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。没有任何类型代理被建立。
须要注意的是:Service 可以将一个接收 port 映射到任意的 targetPort。默认状况下,targetPort 将被设置为与 port 字段相同的值。

实例:

[root@master ~]# cat test3.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: mydeploy
  namespace: default
spec: 
  replicas: 2
  selector: 
    matchLabels: 
      app: amu2
      release: v1
  template: 
    metadata: 
      labels: 
        app: amu2
        release: v1
    spec: 
      containers: 
      - name: amu2
        image: gaofan1225/httpd:latest
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata: 
  name: mysvc
  namespace: default
spec: 
  type: ExternalName		// 更改为ExternalName类型
  externalName: amu.k8s.example.com

// 应用
[root@master ~]# kubectl apply -f test3.yaml 
deployment.apps/mydeploy configured
service/mysvc configured

// 查看创建情况
[root@master ~]# kubectl get pods,svc
NAME                            READY   STATUS    RESTARTS       AGE
pod/busybox                     1/1     Running   1 (165m ago)   3h12m
pod/httpd-77bfff888c-d8sjq      1/1     Running   0              20m
pod/mydeploy-8569f75d78-mld4f   1/1     Running   0              2m24s
pod/mydeploy-8569f75d78-zrj7j   1/1     Running   0              4m43s

NAME                  TYPE           CLUSTER-IP   EXTERNAL-IP            PORT(S)   AGE
service/kubernetes    ClusterIP      10.96.0.1    <none>                 443/TCP   5d4h
service/myapp-exter   ExternalName   <none>       web.test.example.com   <none>    3h17m
service/mysvc         ExternalName   <none>       amu.k8s.example.com    <none>    15m

// 进入容器
[root@master ~]# kubectl exec -it pod/mydeploy-8569f75d78-mld4f /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.

[root@mydeploy-8569f75d78-mld4f src]# ls
apr-1.7.0  apr-util-1.6.1  debug  httpd-2.4.48  kernels
[root@mydeploy-8569f75d78-mld4f src]# cd

// 下载包组
[root@mydeploy-8569f75d78-mld4f ~]# yum -y install bind-utils

[root@mydeploy-8569f75d78-mld4f ~]# nslookup mysvc.default.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10#53

mysvc.default.svc.cluster.local canonical name = amu.k8s.example.com.
** server can't find amu.k8s.example.com: NXDOMAIN

// 其中  10.96.0.10 为 coredns IP
// mysvc.default.svc.cluster.local 为Service域名。格式为:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 指定的集群的域名

[root@mydeploy-8569f75d78-mld4f ~]# dig -t A mysvc.default.svc.cluster.local.@10.96.0.10

; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> -t A mysvc.default.svc.cluster.local.@10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 50932
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 5d689599b0abc71e (echoed)
;; QUESTION SECTION:
;mysvc.default.svc.cluster.local.\@10.96.0.10. IN A

;; Query time: 1005 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Sun Dec 26 06:32:55 UTC 2021
;; MSG SIZE  rcvd: 84


这种类型的Service经过返回CNAME和它的值,能够将服务映射到externalName字段的内容(例如:amu.k8s.example.com;能够实现跨namespace名称空间访问)。ExternalName Service是Service的特例,它没有selector,也没有定义任何的端口和Endpoint。相反的,对于运行在集群外部的服务,它经过返回该外部服务的别名这种方式提供服务。

4.5 ExternalIP示例

若是外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。经过外部 IP(做为目的 IP 地址)进入到集群,打到 Service 端口上的流量,将会被路由到 Service 的 Endpoint 上。

externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴。

实例:

[root@master ~]# cat test3.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: mydeploy
  namespace: default
spec: 
  replicas: 2
  selector: 
    matchLabels: 
      app: amu2
      release: v1
  template: 
    metadata: 
      labels: 
        app: amu2
        release: v1
    spec: 
      containers: 
      - name: amu2
        image: xm17671855780/file_httpd:v0.2
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata: 
  name: mysvc
  namespace: default
spec: 
  selector:
    app: amu2
    release: v1
  ports:
  - name: httpd
    port: 80
    targetPort: 80
  externalIPs:
    - 10.0.0.200

[root@master ~]# kubectl apply -f test3.yaml 
deployment.apps/mydeploy unchanged
service/mysvc configured

// 查看svc详细信息
[root@master ~]# kubectl get svc -o wide
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP            PORT(S)   AGE     SELECTOR
kubernetes    ClusterIP      10.96.0.1       <none>                 443/TCP   5d4h    <none>
myapp-exter   ExternalName   <none>          web.test.example.com   <none>    3h45m   <none>
mysvc         ClusterIP      10.103.103.13   10.0.0.200             80/TCP    43m     app=amu2,release=v1

// curl访问,经过 ClusterIP
[root@master ~]# curl 10.103.103.13
<html><body><h1>It works!</h1></body></html>

// curl访问,经过 ExternalIP
[root@master ~]# curl 10.0.0.200 
<html><body><h1>It works!</h1></body></html>

五、Servcie代理模式

在这里插入图片描述

5.1 kubeadm放式修改ipvs模式

# kubectl edit configmap kube-proxy -n kube-system

...

​	mode: "ipvs"

...

# kubectl delete pod kube-proxy-btz4p -n kube-system

注意:

  • kube-proxy配置文件以configmap方式存储
  • 如果让所有节点生效,需要重建所有节点kube-proxy pod

5.2 二进制方式修改ipvs模式

# vi kube-proxy-config.yaml

mode: ipvs

ipvs:

  scheduler: "rr"

# systemctl restart kube-proxy

**注意:**参考不同资料,文件名可能不同

5.3 流程包

流程:客户端 -> NodePort/ClusterIP(iptables/Ipvs负载均衡规则) -> 分布在各节点Pod

查看负载均衡规则:

  • iptables模式

iptables-save | grep

  • ipvs模式

ipvsadm -L -n

在这里插入图片描述

六、实战

  • 创建一个deployment 副本数3.然后滚动更新镜像版本,并记录这个更新记录,最后在回滚到上一个版本

  • 给一个应用扩容副本数为5

  • 创建一个pod,其中运行着nginx、redis、memcached 3个容器

  • 给一个pod创建service,并可以通过ClusterIP/NodePort访问

  • 创建deployment和service,使用busybox容器nslookup解析service

创建一个deployment副本数为3,然后滚动更新镜像版本,并记录这个更新记录,最后再回滚到上一个版本

[root@master ~]# cat test.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: web
  namespace: default
spec: 
  replicas: 3				// 副本数量
  revisionHistoryLimit: 5			// 版本可留存数量
  strategy: 
    rollingUpdate: 
      maxSurge: 50% 
      maxUnavailable: 50%
    type: RollingUpdate
  selector: 
    matchLabels: 
      app: httpd
  template: 
    metadata:  
      labels:
        app: httpd 
    spec: 
      containers: 
      - name: httpd
        image: gaofan1225/httpd:v0.2
        imagePullPolicy: IfNotPresent

// 应用
[root@master ~]# kubectl apply -f test.yaml 
deployment.apps/web created


// 查看容器创建情况
`[root@master ~]# kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
web-5cbb7b54c6-5tbt5   1/1     Running   0          80s
web-5cbb7b54c6-9ct2q   1/1     Running   0          93s
web-5cbb7b54c6-q6f59   1/1     Running   0          64s


// 查看历史版本记录
[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web 
REVISION  CHANGE-CAUSE
1         <none>

[root@master ~]# vi test.yaml 
    image: gaofan1225/httpd:latest  (本地的)	// 替换镜像
    image: httpd					(获取网上仓库的)
   
// 更新版本
[root@master ~]# kubectl apply -f test.yaml 
deployment.apps/web configured

// 两种版本都运行了一遍,这里只展示一种
[root@master ~]# kubectl get pods
NAME                   READY   STATUS        RESTARTS   AGE
web-5cbb7b54c6-5tbt5   1/1     Terminating   0          2m45s
web-5cbb7b54c6-9ct2q   1/1     Terminating   0          2m58s
web-5cbb7b54c6-q6f59   1/1     Terminating   0          2m29s
web-f8bcfc88-cg9l4     1/1     Running       0          3s
web-f8bcfc88-hpcjk     1/1     Running       0          3s
web-f8bcfc88-wst4t     1/1     Running       0          3s

[root@master ~]# kubectl get pods
NAME                 READY   STATUS    RESTARTS   AGE
web-f8bcfc88-cg9l4   1/1     Running   0          59s
web-f8bcfc88-hpcjk   1/1     Running   0          59s
web-f8bcfc88-wst4t   1/1     Running   0          59s

// 历史版本有3个
[root@master ~]# kubectl rollout history deployment/web
deployment.apps/web 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
3         <none>

// 回滚至版本1
[root@master ~]# kubectl rollout undo deployment/web --to-revision=1
deployment.apps/web rolled back

// 当前处于版本1,由于只使用了三个镜像,然后覆盖,替换了
[root@master ~]# kubectl rollout history deployment/webdeployment.apps/web 
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>

使web容器扩容副本数为5

[root@master ~]# kubectl scale --replicas 5 deployment/web
deployment.apps/web scaled
[root@master ~]# kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
web-5d688b9745-57lf7   1/1     Running   0          2m50s
web-5d688b9745-f2548   1/1     Running   0          2m50s
web-5d688b9745-nqzc8   1/1     Running   0          36s
web-5d688b9745-nsdw9   1/1     Running   0          2m49s
web-5d688b9745-s76nh   1/1     Running   0          36s

创建一个pod,其中运行着nginx、redis、memcached3个容器

[root@master ~]# cat test.yaml 
---
apiVersion: v1
kind: Pod
metadata: 
  name: test
  labels: 
    app: tests
spec: 
  containers: 
  - image: nginx
    name: nginx
  - image: redis
    name: redis
  - image: memcached
    name: memcached

[root@master ~]# kubectl apply -f test.yaml 
pod/test created

[root@master ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
test                        3/3     Running   0          89s

给一个pod创建service,并可以通过ClusterIP/NodePort

[root@master ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED        SIZE
gaofan1225/httpd                                                  v0.2      f61bbd041ba4   13 days ago    89.2MB

[root@master ~]# cat amu.yaml 
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: mydeploy
  namespace: default
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: amu
      release: v1
  template: 
    metadata: 
      labels: 
        app: amu
        release: v1
    spec: 
      containers: 
      - name: amu2
        image: gaofan1225/httpd:v0.2
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata: 
  name: mysvc
  namespace: default
spec: 
  type: NodePort
  selector: 
    app: amu
    release: v1
  ports: 
  - name: httpd
    port: 80
    targetPort: 80
    nodePort: 32100

[root@master ~]# kubectl apply -f amu.yaml 
deployment.apps/mydeploy created
service/mysvc created


[root@master ~]# kubectl get pods,svc
NAME                            READY   STATUS    RESTARTS   AGE
pod/mydeploy-589d66b9cf-skscd   1/1     Running   0          19s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        5d
service/mysvc        NodePort    10.104.79.148   <none>        80:32100/TCP   19s

// 使用 NodePort访问
[root@master ~]# curl 192.168.91.138:32100
<html><body><h1>It works!</h1></body></html>

// 使用ClusterIP访问
[root@master ~]# curl 10.104.79.148
<html><body><h1>It works!</h1></body></html>

创建deployment和service,使用centos容器Nslookup解析service

[root@master ~]# kubectl run amumu --image=busybox:1.28.4 --
 sleep 24h
pod/amumu created


[root@master ~]# kubectl get pods
NAME                        READY   STATUS    RESTARTS        AGE
amumu                       1/1     Running   0               23s

[root@master ~]# kubectl exec -it amumu -- /bin/sh
/ # nslookup kubernetes
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

[root@master ~]# kubectl get svc
NAME          TYPE           CLUSTER-IP      EXTERNAL-IP            PORT(S)   AGE
kubernetes    ClusterIP      10.96.0.1       <none>                 443/TCP   5d5h

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/5565.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!