Kubernetes

1.k8s中的资源

1.1检查网络环境

kubectl -n kube-flannel get pods

kubectl -n kube-flannel get pods -o wide、

1.2资源管理介绍

1.在k8s中,所有的内容都抽象为资源,用户需要通过管理资源来管理k8s( kubectl api-resources 查看k8s中所有的资源)

2.k8s的本质就是一个集群系统,用户可以在集群中部署各种服务

3.所谓的部署服务,其实就是在kubernetes集群中运行一个个容器,并将指定的程序跑在容器中

4.kubernetes的最小管理单元式pod而不是容器,只能将容器放在pod中

5.kubernetes一般不会直接管理pod而是通过控制器来管理pod

6.pod中服务的访问是通过kubernetes提供的service(微服务暴露端口)资源来实现

7.pod中程序的数据需要持久化是由kubernetes提供的各种存储来实现的

1.3资源管理方式

1.命令式(操作完就没了,不能审计与跟踪)

复制代码
kubectl run nginx-pod   --image=nginx:latest --port=80

2.文件式(不能做更新,只能建立)

复制代码
kubectl cerate -f nginx-pod.yaml

3.声明式

复制代码
kubectl apply -f nginx-pod.yaml

4.create与apply的区别

复制代码
kubectl run testpod --image nginx --dry-run=client -o yaml > test.yml 
kubectl create -f test.yml //运行yml文件(yml文件更改后不可更改)
kubectl apply -f test.yml // yml运行后可以更改
kubectl delete pods testpod --force//删除pods
1.3.1基本命令
复制代码
 kubectl create deployment zee --image myapp:v1 --replicas 2// 用控制器创建可指定pod的数量
复制代码
 kubectl explain deployment// 查看资源帮助
复制代码
 kubectl edit deployments.apps zee//编辑控制器配置
复制代码
 kubectl patch deployments.apps zee -p '{"spec":{"replicas":2}}'//利用补丁更改控制器配置
复制代码
 kubectl delete deployments.apps zee//删除pod
复制代码
 kubectl run wyz --image nginx
 kubectl expose pod wyz --port 80 --target-port 80//对内暴露,使pod可在本机被访问
 kubectl get service
 curl 10.109.202.74
复制代码
 kubectl edit service zee//将spec下的ClusterIP(对内,服务类型)改为NodePort
复制代码
 kubectl describe pods//查看详细信息
复制代码
 kubectl logs pods/zee//查看某一个pods的日志
复制代码
 kubectl run -it  testpod --image busyboxplus//运行交互pod
 # ctrl + pq 退出不停止pod
 kubectl attach pods/testpod -it //再次进入pod
复制代码
 kubectl cp /etc/passwd wyz:/
 kubectl exec pods/wyz -c wyz -it -- bin/sh(-c:指定容器)
1.3.2高级指令

1.利用命令生成yaml

复制代码
kubectl create deployment zee --image buxybox --dry-run=client -o yaml > dep-zee.yml //创建控制器pod
kubectl apply -f dep-zee.yml 

2.删除pod

复制代码
kubectl delete -f dep-zee.yml

3.查看标签,更改标签

标签功能,设定两个pod,更改一个标签后,控制器识别到少了一个zee标签的pod,于是它会再启动一个pod,将标签改回来后,控制器识别到多了一个pod,于是它会删除一个pod(控制器控制pod数量 )

复制代码
kubectl get pods --show-labels
复制代码
kubectl get label pods zee-5f46cc654-8xc4h(name) app=xxx --overwrite

2.pod(k8s中最小控制单元)

pod是可以创建和管理k8s计算的最小可部署单元

多个容器间共享ipc network

复制代码
kubectl get pods//查看当前pods
​
kubectl get pods    --all-namespace//查看所有pods
​
kubectl get pods    -o  wide//可以看到pods名称等
​
kubectl get pods    -o  yaml//以yaml的形式查看

生成yml文件进行资源管理 kubectl run testpod1 --image nginx --dry-run=client -o yaml > testpod1.yml

命令式对配置(只能建立) kubectl create -f testpod1.yml

生命式对象配置(除了建立以外还可以做更新)kubectl apply -f testpod1.yml

2.1利用控制器管理pod

高可用性和高可靠性:1.自动故障恢复;2.健康检查和自愈

可扩展性:1.轻松扩缩容;2.水平自动扩缩容(HPA,无法单独运行)

版本管理和更新:1.滚动更新;2.回滚

声明式配置:1.简洁的配置方式;2.期望状态管理

服务发现和负载均衡:1.自动注册和发现;2.流量分发

多环境一致性:一致的部署方式

kubectl expose deployment zee --port 80 --target-port 80//进行暴露

kubectl delect services zee//如果在暴露时端口被占用,删除占用的服务,删除后重新暴露

kubectl describe service zee//显示资源的详细信息

pod的扩容和缩容

kubectl scale deployment zee --replicas 4//扩容,设置副本数量为4,缩容,更改副本数量(做四个负载均衡)

控制器自动负载均衡,前提是将pod暴露

2.2pod更新及回滚

网络插件有问题

kubectl delete -f kub-fannel.yaml//删除

kubectl apply -f kub-fannel.yaml//重新添加

1.kubectl create deployment zee --image myapp:v1 --replicas 2//创建两个控制器

2.暴露zee的端口

3.kubectl set image deployments/zee myapp=myapp:v2//更新版本为v2

4.kubectl rollout history deployment zee//查看版本更新

5.kubectl rollout undo deployment zee --to-revision 1//版本回滚

2.3利用yaml文件部署应用

清晰的表达期望,重复的利用,灵活和可扩展

kubectl api-resources//查看所有api版本

spec:详细定义对象

command:启动容器时要执行的命令

2.3.1运行多个pod
复制代码
spec:
  containers:
  - image: nginx
    name: zee-container
  - image: buxybox:latest
    name: zee-container
    command: ["/bin/sh","-c","sleep 100000"]
​
2.3.2端口映射
复制代码
spec:
  containers:
  - image: nginx
    name: zee-container
    ports:
      - name: webport
        containerPort: 80
        hostPort: 80
        protocol: TCP
​

如果没有进行端口暴露,则只能通过pod的ip来访问,如果暴露则可以通过主机的ip进行访问

2.3.3设定环境变量
复制代码
spec:
  containers:
  - image: nginx
    name: zee-container
    command: ["/bin/sh","-c","echo $NAME;sleep 100000"]
    env:
      - name: "NAME"
        value: "wyingzee"
2.3.4资源限制
复制代码
spec:
  containers:
  - image: nginx
    name: wenserver1
    resources:
      limits:
        cpu: 1
        memory: 200mi
      requests:
        cpu: 500m
        memory: 100mi
​

limits的值要大于requests,++如果将limits的值设置的与request的值一样大,那么此时的优先级最大++

2.3.5容器的启动管理
复制代码
spec:
  restartpolicy: Always
  containers:
  - image: nginx
    name: wenserver1
    command: ["/bin/sh", "-c","echo hello zee"]

Always:pod一旦终止运行不论是怎样终止的,kubernetes都会重启它(不管正不正确都不能终止)

Never:退出后就执行完了

OnFailure: 容器正常就不管,非正常就重启(必须正确终止)

2.3.6共享宿主机网络
复制代码
spec:
  hostNetwork: true
  containers:
  - image: nginx
    name: wenserver1
    command: ["/bin/sh", "-c","sleep 10000"]
​

2.4pod的生命周期

2.4.1init容器

pod可以包含多个容器,init容器的运行是一个接一个,init容器不支持readiness就绪探针

如果pod的init容器运行失败,那么kubernetes会不断重启该pod,知道init容器运行成功为止,但如果pod的restartpolicy的值是never,那么他就不会重新启动

2.4.1.1nit容器的功能

做主容器运行之前要做的事,如判断,运行一些指令让环境中有一些什么东西

Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。

Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。

Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。

由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动

2.4.1.2init容器示例
复制代码
spec:
  containers:
  - image: nginx
    name: wyingzee
  initContainers:
  - image: busyboxplus:latest
    name: initnode
    command: ["sh","-c","until test -e /testfile;do echo wating for myservice; sleep 2 done"]
​

先运行init容器,运行成功后再运行上面的

2.4.2探针

主要功能:kubernetes对容器执行定期诊断

Execation:在容器内执行指定命令

2.4.2.1存活探针
复制代码
spec:
  containers:
  - image: nginx
    name: wyingzee
    livenessProbe://探针类型
      tcpSocket://tcp的方式检测
        port: 8080
      initalDelaySecond: 3//容器运行了多少秒后开始检测
      periodSeconds: 1//每隔一秒检测一次
      timoutSecounds: 1
​

livenessProbe:指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。

2.4.2.2就绪探针
复制代码
spec:
  containers:
  - image: nginx
    name: wyingzee
    readinessProbe://探针类型
      httpGet:# HTTPGetAction:对指定的端口和路径上的容器的IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。
        path: /test.html
        prot: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1
​

readinessProbe:指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Succes(没有准备好就不暴露出来,准备好就暴露出来)

3.控制器

3.1什么是控制器

控制器管理的 Pod:在控制器的生命周期里,始终要维持 Pod 的副本数目

Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。如果Pod资源在运行中出现故障,它会基于指定策略重新编排Pod

当建立控制器后,会把期望值写入etcd,k8s中的apiserver检索etcd中我们保存的期望状态,并对比pod的当前状态,如果出现差异代码自驱动立即恢复

3.2控制器常用类型

ReplicaSet :ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行 (无版本更新的能力)

Deployment: 一个 Deployment 为 PodReplicaSet 提供声明式的更新能力 (无状态,每次启动都是随机的)

DaemonSet: DaemonSet 确保全指定节点上运行一个 Pod 的副本

StatefulSet: StatefulSet 是用来管理有状态应用的工作负载 API 对象。(每次启动都是固定的)

Job: 执行批处理任务,仅执行一次任务,保证任务的一个或多个Pod成功结束

CronJob: Cron Job 创建基于时间调度的 Jobs。

HPA全称Horizontal Pod Autoscaler : 根据资源利用率自动调整service中Pod数量,实现Pod水平自动缩放(自动扩容和缩容,没有监控不能做)

3.3replicaset控制器(通过标签控制pod的数量,无法控制版本)

ReplicaSet和Replication Controller的唯一区别是选择器的支持,ReplicaSet支持新的基于集合的选择器需求

ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行

虽然 ReplicaSets 可以独立使用,但今天它主要被Deployments 用作协调 Pod 创建、删除和更新的机制

3.3.1replicaset示例
复制代码
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: replicaset
  name: replicaset
spec:
  replicas: 2
  selector:
    matchLabels:
      app: replicaset
  template:
    metadata:
      labels:
        app: replicaset
    spec:
      containers:
      - image: nginx
        name: nginx
​

3.4deployment 控制器(可以控制版本)

先控制replicaset,通过replicaset来控制pod

Deployment 为 Pod 和 ReplicaSet 提供了一个申明式的定义方法

在Deployment中ReplicaSet相当于一个版本

用来创建Pod和ReplicaSet

滚动更新和回滚

扩容和缩容

暂停与恢复

3.4.1depolyment示例
复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: zee
  name: zee
spec:
  replicas: 4
  selector:
    matchLabels:
      app: zee
  template:
    metadata:
      labels:
        app: zee
    spec:
      containers:
      - image: myapp:v2
        name: myapp
​
3.4.2版本迭代

进入yml文件将v2改为v1,然后再次声明

想要被访问需要将端口暴露

复制代码
kubectl expose deployment zee-dp --port 80 --target-port 80 --dry-run=client -o yaml >> zee.yml #将service追加在zee.yml后面
复制代码
kubectl get svc zee #查看zee服务的信息
3.4.3版本回滚

将zee.yml中的v1改为v2

RollingUpdateStrategy: 25% max unavailable, 25% max surge//更新策略

3.4.4滚动更新策略
复制代码
spec:
  minReadySeconds: 5        #最小就绪时间,指定pod每隔多久更新一次
  replicas: 4
  strategy:                 #指定更新策略
    rollingUpdate:
      maxSurge: 1           #比定义pod数量多几个,最多比这四个多一个,在更新的时候一个一个来做
      maxUnavailable: 0     #比定义pod个数少几个,必须保证这四个能用
3.4.5暂停及恢复

在生产中我们需要等所有的更新都完成后再上线

复制代码
kubectl rollout pause deployment zee #将更新暂停
复制代码
    spec:
      containers:
      - image: nginx
        name: nginx
      resources:
        limits:
          cpu: 0.5
          memory: 100mi
        resquests:
          cpu: 0.5
          memory: 100mi
#做资源限制,此时资源限制没有生效,因为更新被暂停了
复制代码
kubectl rollout resume deployment zee #恢复更新

查看所有的是否都更新完

复制代码
kubectl rollout history deployment zee

3.5daemonset控制器

DaemonSet 确保全部(或者某些)节点上运行一个 Pod 的副本。当有节点加入集群时, 也会为他们新增一个 Pod ,当有节点从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod(有污点tains,不建立,pod可以设置对污点的容忍)

3.5.1daemonset示例(不能对pod的数量进行指定)
复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: zee-dm
  name: zee-dm
spec:
  selector:
    matchLabels:
      app: zee-dm
  template:
    metadata:
      labels:
        app: zee-dm
    spec:
      tolerations:              #对于污点节点的容忍
      - effect: NoSchedule
        operator: Exists  #对污点强容忍
      containers:
      - image: nginx
        name: nginx
​
​

将zee.yml复制为zee-dm.yml

做完容忍度后,pod就会再master节点上创建

3.6job控制器

Job,主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务

3.6.1job示例
复制代码
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 6        #一共完成任务数为6      
  parallelism: 2        #每次并行完成2个
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]   计算Π的后2000位
      restartPolicy: Never                      #关闭后不自动重启
  backoffLimit: 4                               #运行失败后尝试4重新运行
​
[root@k8s2 pod]# kubectl apply -f job.yml

关于重启策略设置的说明:

  • 如果指定为OnFailure,则job会在pod出现故障时重启容器

    而不是创建pod,failed次数不变

  • 如果指定为Never,则job会在pod出现故障时创建新的pod

    并且故障pod不会消失,也不会重启,failed次数加1

  • 如果指定为Always的话,就意味着一直重启,意味着job任务会重复去执行了

3.7cronjob控制器

  • ron Job 创建基于时间调度的 Jobs。

  • CronJob控制器以Job控制器资源为其管控对象,并借助它管理pod资源对象,

  • CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。

  • CronJob可以在特定的时间点(反复的)去运行job任务。

3.7.1cronjob示例
复制代码
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers: #是一个列表所以要加“-”
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent #本地有就用本地的,没有就拉取
            command: [" - /bin/sh -c date; echo Hello from the Kubernetes cluster"]
          restartPolicy: OnFailure #失败后对容器进行重启不记录在失败次数内
​
[root@k8s2 pod]# kubectl apply -f cronjob.yml

4.微服务

4.1什么是微服务

当pod的标签与微服务的标签一致时pod的业务就可以通过微服务发布出去

用控制器来完成集群的工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问

  • Service是一组提供相同服务的Pod对外开放的接口。

  • 借助Service,应用可以实现服务发现和负载均衡。

  • service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

4.2微服务的类型(四层)

ClusterIP: 默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问

NodePort :将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP(在微服务中加入type)

LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort,此模式只能在云服务器上使用

ExternalName :将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定

4.3ipvs

  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的

  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源

  • IPVS模式的service,可以使K8s集群支持更多量级的Pod

iptables会大量消耗资源,设置为ipvs会大大节省资源,并且使调度更加精准

4.3.1ipvs模式配置方式(service的工作模式优化)
复制代码
kubectl -n kube-system edit cm kube-proxy #找到mode
复制代码
kubectl -n kube-system get pod | awk '/proxy/{system("kubectl -n kube-system delete pods "$1)}'#将原有的pod删除,使它生成新的pod(刷新)

将pod删除后,策略也会消失

4.4clusterip

clusterip模式只能在集群内访问,并对集群内的pod提供健康检测和自动发现功能(通过标签实现)

1.先创建一个pod

复制代码
kubectl run testpod --image nginx

2.为pod建立一个微服务,将pod发布

复制代码
kubectl expose pod testpod --port 80 --target-port 80 --dry-run=client -o yaml > testpod.yml
复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    run: testpod
  name: testpod
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: testpod
  type: ClusterIp
​

3.新建一个pod,将pod的标签改为上一个服务的标签,它会自动发现并将pod加入到策略中

复制代码
kubectl label pod testpod1 run=testpod --overwrite #新建一个pod

4.service创建后集群DNS提供解析

复制代码
kubectl -n kube-system get svc #查看微服务的dns
复制代码
dig testpod.default.svc.cluster.local@10.96.0.10(svc.cluster.local固定格式)

在集群内部可通过域名访问

4.4.1clusterIP中特殊的模式headless(无头服务)

客户端直接访问pod,而不是通过访问svc访问pod,暴露pod本身的ip且不会加入到ipvsadm的策略中

复制代码
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: timinglee
  type: ClusterIP
  clusterIP: None

4.5nodeport

通过ipvs暴漏端口从而使外部主机通过master节点的对外ip:<port>来访问pod业务

会在pod暴露一个端口,在访问的时候就访问这个端口

复制代码
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: timinglee
  type: ClusterIP
  clusterIP: NodePort
​

nodeport默认端口

nodeport默认端口是30000-32767,超出会报错,如果想要超出这个范围,则需要修改配置

复制代码
vim /etc/kubernetes/manifests/kube-apiserver.yaml
​
- --service-node-port-range=30000-40000 #修改参数后集群会自动重启
复制代码
spec:
  ports:
​
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 33333 #指定端口
      selector:
    app: timinglee
      type: NodePort

4.6loadbalancer

云平台会为我们分配vip并实现访问,如果是裸金属主机那么需要metallb来实现ip的分配

复制代码
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: timinglee
  type: LoadBalancer

配置完后,无法生成对外的ip,于是我们需要搭建matelLbn来分配对外的ip

4.7matelLb

为loadbalancer分配对外的ip

4.7.1下载matelLb

1.设置ipvs模式 [root@k8s-master ~]# kubectl edit cm -n kube-system kube-proxy apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: strictARP: true

[root@k8s-master ~]# kubectl -n kube-system get pods | awk '/kube-proxy/{system("kubectl -n kube-system delete pods "$1)}'

2.下载部署文件 [root@k8s2 metallb]# wget https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

3.修改文件中镜像地址,与harbor仓库路径保持一致 [root@k8s-master ~]# vim metallb-native.yaml ... image: metallb/controller:v0.14.8 image: metallb/speaker:v0.14.8

4.上传镜像到harbor [root@k8s-master ~]# docker pull quay.io/metallb/controller:v0.14.8 [root@k8s-master ~]# docker pull quay.io/metallb/speaker:v0.14.8

[root@k8s-master ~]# docker tag quay.io/metallb/speaker:v0.14.8 reg.timinglee.org/metallb/speaker:v0.14.8 [root@k8s-master ~]# docker tag quay.io/metallb/controller:v0.14.8 reg.timinglee.org/metallb/controller:v0.14.8

[root@k8s-master ~]# docker push reg.timinglee.org/metallb/speaker:v0.14.8 [root@k8s-master ~]# docker push reg.timinglee.org/metallb/controller:v0.14.8

4.7.2部署服务
复制代码
kubectl apply -f metallb-native.yaml
kubectl get namespaces 
NAME              STATUS   AGE
metallb-system    Active   6s
[root@k8s-master metalLbn]# vim configmap.yml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool                      #地址池名称
  namespace: metallb-system
spec:
  addresses:
  - 172.25.254.50-172.25.254.99         #修改为自己本地地址段
​
---                                     #两个不同的kind中间必须加分割
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool                          #使用地址池 
​
 kubectl apply -f configmap.yml
 [root@k8s-master metalLbn]# kubectl -n metallb-system get configmaps
 

此时就有对外的ip了

复制代码
[root@k8s-master ~]# kubectl get service
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP        5d19h
testpod      LoadBalancer   10.96.214.227   172.25.254.50   80:31039/TCP   2s
​

4.8externalname

++将外部的业务迁移到k8s时所用到++

功能:在集群内指定一个svc把这个svc和外部的一个资源地址绑定

  • 开启services后,不会被分配IP,而是用dns解析CNAME固定域名来解决ip变化问题

  • 一般应用于外部业务和pod沟通或外部业务迁移到pod内时

  • 在应用向集群迁移过程中,externalname在过度阶段就可以起作用了。

  • 集群外的资源迁移到集群时,在迁移的过程中ip可能会变化,但是域名+dns解析能完美解决此问题

复制代码
[root@k8s-master ~]# vim zee.yaml
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: zee-service
  name: zee-service
spec:
  selector:
    app: zee
  type: ExternalName
  externalName: www.zee.org
​
​
[root@k8s-master ~]# kubectl apply -f zee.yaml
​
[root@k8s-master ~]# kubectl get services  zee-service
NAME                TYPE           CLUSTER-IP   EXTERNAL-IP         PORT(S)   AGE
zee-service   ExternalName   <none>       www.zee.org   <none>    2m58s

4.9ingress-nginx

4.9.1ingress主要功能

主要功能:ingress借助services来访问pod

  • 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,支持7层

  • Ingress由两部分组成:Ingress controller和Ingress服务

  • Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。

  • 业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller。

4.9.2部署ingress

创建两个deployment,然后将他们以yml的形式暴露出去

将镜像上传到harper仓库

如果镜像有问题则需要再各个节点删除镜像

[root@k8s-master app]# docker load -i ingress-nginx-1.11.2.tag.gz Loaded image: reg.timinglee.org/ingress-nginx/controller:v1.11.2 Loaded image: reg.timinglee.org/ingress-nginx/kube-webhook-certgen:v1.4.3

[root@k8s-master app]# docker tag reg.timinglee.org/ingress-nginx/controller:v1.11.2 reg.wyz.org/ingress-nginx/controller:v1.11.2 [root@k8s-master app]# docker tag reg.timinglee.org/ingress-nginx/kube-webhook-certgen:v1.4.3 reg.wyz.org/ingress-nginx/kube-webhook-certgen:v1.4.3

[root@k8s-master app]# docker push reg.wyz.org/ingress-nginx/controller:v1.11.2

[root@k8s-master app]# docker push reg.wyz.org/ingress-nginx/kube-webhook-certgen:v1.4.3

复制代码
kubectl apply -f deploy.yaml #安装
复制代码
[root@k8s-master app] kubectl get namespaces 
NAME              STATUS   AGE
ingress-nginx     Active   30s#安装后会会建立一个域
​

安装失败

复制代码
kubectl delete -f deploy.yaml #删除

修改文件,让它去我们的库下载

修改文件中的image

查看运行情况

复制代码
[root@k8s-master app]# kubectl -n ingress-nginx get pods

现在就可以用了

4.9.3ingress示例

创建ingress发布svc

复制代码
kubectl create ingress testpod --rule '*/=testpod:80' --dry-run=client -o yaml > ingress.yml #创建ingress
复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: testpod
spec:
  ingressClassName: nginx
  rules:
  - host:
    http:
      paths:
      - backend:
          service:
            name: testpod
            port:
              number: 80
        path: /
        pathType: Prefix
复制代码
kubectl -n ingress-nginx edit svc ingress-nginx-controller #修改微服务为loadbalancer
复制代码
kubectl -n ingress-nginx get all #查看
复制代码
kubectl get ingress
NAME      CLASS   HOSTS   ADDRESS   PORTS   AGE
testpod   nginx   *                 80      75s

此时访问它的外部IP就可以访问到pod

4.9.4ingress的高级用法
4.9.4.1基于路径访问
复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: testpod
spec:
  ingressClassName: nginx
  rules:
  - host:
    http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /v1
        pathType: Prefix
      - backend:
          service:
            name: myappv2
            port:
              number: 80
        path: /v2
        pathType: Prefix
        
# 动静分离
复制代码
kubectl describe ingress testpod # 查看
4.9.4.2基于域名的访问

在测试主机解析

复制代码
vim /etc/hosts

建立基于域名的yml文件

复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  ingressClassName: nginx
  rules:
  - host: myappv1.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: myapp-v1
            port:
              number: 80
        path: /
        pathType: Prefix
  - host: myappv2.timinglee.org
    http:
      paths:
      - backend:
          service:
            name: myapp-v2
            port:
              number: 80
        path: /
        pathType: Prefix
相关推荐
huosenbulusi8 小时前
helm推送到harbor私有库--http: server gave HTTP response to HTTPS client
云原生·容器·k8s
不会飞的小龙人9 小时前
Docker Compose创建镜像服务
linux·运维·docker·容器·镜像
不会飞的小龙人9 小时前
Docker基础安装与使用
linux·运维·docker·容器
张3蜂10 小时前
docker Ubuntu实战
数据库·ubuntu·docker
元气满满的热码式14 小时前
K8S中Service详解(三)
云原生·容器·kubernetes
染诗14 小时前
docker部署flask项目后,请求时总是报拒绝连接错误
docker·容器·flask
张3蜂16 小时前
docker 部署.netcore应用优势在什么地方?
docker·容器·.netcore
心惠天意18 小时前
docker-compose篇---创建jupyter并可用sudo的创建方式
docker·jupyter·容器
huaweichenai19 小时前
windows下修改docker的镜像存储地址
运维·docker·容器
菠萝炒饭pineapple-boss19 小时前
Dockerfile另一种使用普通用户启动的方式
linux·docker·dockerfile