K8s Service对外暴露端口与代理方式

[root@master test]# kubectl apply -f test.yml

deployment.apps/web created

service/web1 created

[root@master test]# kubectl get pod,svc

NAME READY STATUS RESTARTS AGE

pod/web-9b8f648df-7vrjb 1/1 Running 0 9s

pod/web-9b8f648df-cktwk 1/1 Running 0 9s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/kubernetes ClusterIP 10.96.0.1 443/TCP 7d3h

service/web1 ClusterIP 10.100.228.232 80/TCP 9s

[root@master test]# curl 10.100.228.232

test page on jjyy

//利用域名访问

[root@master test]# kubectl run -it b1 --image busybox – /bin/sh

/ # wget -q -O - http://web1

test page on jjyy

  • NodePort:在每个节点上都监听一个同样的端口号(30000-32767),ClusterIP和路由规则会自动创建。对外暴露应用(集群内外都可使用)

[root@master ~]# cat test/test.yml

apiVersion: apps/v1

kind: Deployment

metadata:

name: web

namespace: default

spec:

replicas: 2

selector:

matchLabels:

app: httpd

template:

metadata:

labels:

app: httpd

spec:

containers:

  • name: httpd

image: 1314444/httpd:v0.1

imagePullPolicy: IfNotPresent


apiVersion: v1

kind: Service

metadata:

name: web1

namespace: default

spec:

ports:

  • port: 80

protocol: TCP

nodePort: 30000

targetPort: 80

selector:

app: httpd

type: NodePort

[root@master ~]# kubectl apply -f test/test.yml

deployment.apps/web unchanged

service/web1 configured

[root@master ~]# kubectl get pod,svc

NAME READY STATUS RESTARTS AGE

pod/web-9b8f648df-7vrjb 1/1 Running 0 16m

pod/web-9b8f648df-cktwk 1/1 Running 0 16m

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/kubernetes ClusterIP 10.96.0.1 443/TCP 7d3h

service/web1 NodePort 10.100.228.232 80:30000/TCP 16m

[root@master ~]# curl 10.100.228.232

test page on jjyy

ip+31015

在这里插入图片描述

  • LoadBalancer:使用外部负载均衡。其实也是NodePort,只不过会把:自动添加到公有云的负载均衡当中。对外暴露应用,适用公有云

Service代理模式


在这里插入图片描述

kubeadm方式修改ipvs模式

[root@master ~]# kubectl edit configmap kube-proxy -n kube-system

mode: "ipvs "

[root@master ~]# kubectl delete pod kube-proxy-btz4p -n kube-system

注:

1、kube-proxy配置文件以configmap方式存储

2、如果让所有节点生效,需要重建所有节点kube-proxy pod

二进制方式修改ipvs模式

[root@master ~]# vi kube-proxy-config.ymlmode: ipvs

ipvs:

scheduler: "rr "

[root@master ~]# systemctl restart kube-proxy

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

流程包流程

客户端->NodePort/ClusterlP (iptables/lpvs负载均衡规则)->分布在各节点Pod

查看负载均衡规则

iptables模式

iptables-save lgrep

ipvs模式

ipvsadm -L -n

Service工作流程图

在这里插入图片描述

lptables和IPVS的对比

lptables

  • 灵活,功能强大

  • 规则遍历匹配和更新,呈线性时延

lPVS

  • 工作在内核态,有更好的性能

  • 调度算法丰富: rr, wrr,lc,wlc,ip hash…

Service DNS名称


CoreDNS

  • 是一个DNS服务器,Kubernetes默认采用,以Pod部署在集群中,CoreDNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析。

CoreDNS YAML文件

ClusterlP A记录格式

  • ..svc.cluster.local示例: my-svc.my-namespace.svc.cluster.local

在这里插入图片描述

[root@master ~]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 443/TCP 7d5h

web1 NodePort 10.101.173.65 80:30009/TCP 18m

[root@master ~]# kubectl run -it b1 --image busybox – /bin/sh

If you don’t see a command prompt, try pressing enter.

/ # nslookup web1.default.svc.cluster.local

Server: 10.96.0.10

Address: 10.96.0.10:53

Name: web1.default.svc.cluster.local

Address: 10.101.173.65

操作小练习


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

[root@master ~]# vi test/test.yml

[root@master ~]# cat test/test.yml

apiVersion: apps/v1

kind: Deployment

metadata:

labels:

app: httpd

name: web

namespace: default

spec:

replicas: 3

selector:

matchLabels:

app: httpd

template:

metadata:

labels:

app: httpd

spec:

containers:

  • name: httpd

image: 1314444/httpd:v0.1

imagePullPolicy: IfNotPresent

//升级(kubectl set image deployment.apps/{deployment名称} {镜像名称}:={镜像名称}:{版本})

[root@master ~]# kubectl set image deployment.apps/web httpd=1314444/httpd:v0.2

deployment.apps/web image updated

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

web-7bcffb4f6-5hqsm 1/1 Running 0 12s

web-7bcffb4f6-66gjp 1/1 Running 0 13s

web-7bcffb4f6-jfzbm 1/1 Running 0 11s

web-9b8f648df-5mzk4 1/1 Terminating 0 9m7s

web-9b8f648df-nbhvk 1/1 Terminating 0 9m7s

web-9b8f648df-tgbb8 1/1 Terminating 0 9m7s

[root@master ~]# kubectl get deployment

NAME READY UP-TO-DATE AVAILABLE AGE

web 3/3 3 3 9m16s

//回滚默认情况下, Deployment 的上线记录都会保留在系统中,以便可以随时回滚,查看 Deployment 的上线历史记录

[root@master ~]# kubectl rollout history deployment web

deployment.apps/web

REVISION CHANGE-CAUSE

1

2

//查看版本

[root@master ~]# kubectl rollout history deployment web --revision=2

deployment.apps/web with revision #2

Pod Template:

Labels: app=httpd

pod-template-hash=7bcffb4f6

Containers:

httpd:

Image: 1314444/httpd:v0.2

Port:

Host Port:

Environment:

Mounts:

Volumes:

//回滚到上一个版本

[root@master ~]# kubectl rollout undo deployment web --to-revision=1

deployment.apps/web rolled back

[root@master ~]# kubectl rollout history deployment web

deployment.apps/web

REVISION CHANGE-CAUSE

2

3

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

[root@master ~]# kubectl scale deploy/web --replicas=5

deployment.apps/web scaled

[root@master ~]# kubectl get pod

NAME READY STATUS RESTARTS AGE

web-9b8f648df-c4rzm 1/1 Running 0 2m45s

web-9b8f648df-h7gmp 1/1 Running 0 2m43s

web-9b8f648df-q8p2f 0/1 ContainerCreating 0 2s

web-9b8f648df-q9m56 0/1 ContainerCreating 0 2s

web-9b8f648df-wjtmf 1/1 Running 0 2m44s

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

[root@master test]# cat pod.yml

apiVersion: v1

kind: Pod

metadata:

name: test

labels:

app: test

spec:

containers:

  • name: nginx

image: nginx

imagePullPolicy: IfNotPresent

  • name: redis

image: redis

imagePullPolicy: IfNotPresent

  • name: memcached

image: memcached

imagePullPolicy: IfNotPresent

[root@master test]# kubectl apply -f pod.yml

pod/test created

[root@master test]# kubectl get pod

NAME READY STATUS RESTARTS AGE

test 3/3 Running 0 40s

4、给一个pod创建service,并可以通过ClusterlP/NodePort访问

[root@master ~]# cat test/test.yml

apiVersion: apps/v1

kind: Deployment

metadata:

name: web

namespace: default

spec:

replicas: 2

selector:

matchLabels:

app: httpd

template:

metadata:

labels:

app: httpd

spec:

containers:

  • name: httpd

image: 1314444/httpd:v0.1

imagePullPolicy: IfNotPresent


apiVersion: v1

kind: Service

metadata:

name: web1

namespace: default

spec:

ports:

  • port: 80

protocol: TCP

nodePort: 30009

targetPort: 80

selector:

app: httpd

type: NodePort

[root@master ~]# kubectl apply -f test/test.yml

deployment.apps/web created

service/web1 created

[root@master ~]# kubectl get pod,svc

NAME READY STATUS RESTARTS AGE

pod/web-9b8f648df-jdm8g 1/1 Running 0 8s

pod/web-9b8f648df-qtm47 1/1 Running 0 8s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

service/kubernetes ClusterIP 10.96.0.1 443/TCP 7d5h

service/web1 NodePort 10.109.3.154 80:30009/TCP 8s

[root@master ~]# curl 10.109.3.154

test page on jjyy

[root@master ~]# curl 192.168.129.250:30009

test page on jjyy

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

[root@master ~]# kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.96.0.1 443/TCP 7d5h

web1 NodePort 10.101.173.65 80:30009/TCP 18m

[root@master ~]# kubectl run -it b1 --image busybox – /bin/sh

If you don’t see a command prompt, try pressing enter.

/ # nslookup web1.default.svc.cluster.local

Kubernetes中,可以通过Service和Ingress来将业务对外暴露。其中,Service是一种抽象,定义了一组Pod的访问方式,而Ingress则是对Service的进一步抽象,可以将多个Service暴露在同一个IP和端口下,并提供负载均衡和路由等功能。 具体实现步骤如下: 1. 创建Deployment,定义Pod的副本数和容器镜像等信息。 2. 创建Service,将Deployment中的Pod暴露出来,定义Service的类型、端口和访问方式等信息。 3. 创建Ingress,将Service暴露出来,定义Ingress的规则、路径和后端Service等信息。 4. 配置Ingress Controller,将Ingress与实际的负载均衡器或代理服务器绑定,实现对外访问。 下面是一个示例YAML文件,演示了如何通过Ingress将两个Service暴露出来,并提供不同的路径和主机名访问: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:v1 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: myapp spec: selector: app: myapp ports: - name: http port: 80 targetPort: 80 type: ClusterIP --- apiVersion: v1 kind: Service metadata: name: mydb spec: selector: app: mydb ports: - name: mysql port: 3306 targetPort: 3306 type: ClusterIP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress spec: rules: - host: myapp.example.com http: paths: - path: /app pathType: Prefix backend: service: name: myapp port: name: http - host: mydb.example.com http: paths: - path: /db pathType: Prefix backend: service: name: mydb port: name: mysql ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值