Service的三种代理模式
- userspace:1.1-
- iptables:1.10-
- ipvs:1.11+
Service类型
- ExternalName
- ClusterIP
- NodePort
- LoadBlance
资源记录
SVC_NAME.NS_NAME.DOMAIN.LTD.
默认:svc.cluster.local.
ClusterIP
#查看service定义
[root@master ~]# kubectl explain svc
#创建一个deployment类型的redis的yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: redis
role: logstor
template:
metadata:
labels:
app: redis
role: logstor
spec:
containers:
- name: redis
image: redis:4.0-alpine
ports:
- name: redis
containerPort: 6379
[root@master manifests]# kuberctl apply -f ds-demo.yaml
#为redis创建一个ClusterIP类型的service
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: default
spec:
selector:
app: redis
role: logstor
clusterIP: 10.97.97.97
type: ClusterIP
ports:
- port: 6379
targetPort: 6379
[root@master manifests]# kubectl apply -f redis-svc.yaml
service/redis created
[root@master manifests]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d22h
nginx NodePort 10.105.125.19 <none> 80:31526/TCP 4d23h
redis ClusterIP 10.97.97.97 <none> 6379/TCP 14s
[root@master manifests]# kubectl describe service redis
Name: redis
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=redis,role=logstor
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.97.97.97
IPs: 10.97.97.97
Port: <unset> 6379/TCP
TargetPort: 6379/TCP
Endpoints: 10.244.1.35:6379
Session Affinity: None
Events: <none>
NodePort
#myapp的yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: tye
template:
metadata:
labels:
app: myapp
release: tye
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v4
ports:
- name: http
containerPort: 80
#创建一个NodePort的Service
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: tye
clusterIP: 10.99.99.99
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
[root@master manifests]# kubectl apply -f myapp-svc.yaml
service/myapp created
#查看service
[root@master manifests]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h
myapp NodePort 10.99.99.99 <none> 80:30080/TCP 41s
nginx NodePort 10.105.125.19 <none> 80:31526/TCP 4d23h
redis ClusterIP 10.97.97.97 <none> 6379/TCP 28m
[root@master manifests]# kubectl describe service myapp
Name: myapp
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=myapp,release=tye
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.99.99.99
IPs: 10.99.99.99
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.244.3.46:80,10.244.3.47:80,10.244.3.49:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
#找一台其它的虚拟机测试访问情况
[root@lotus ~]# while true; do curl http://192.168.88.101:30080/hostname.html;sleep 1; done
myapp-deploy-5cf7978485-jwvtl
myapp-deploy-5cf7978485-gsppv
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-gsppv
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-jwvtl
#修改sessionAffinity属性,添加客户端的session亲密性,同一客户端访问调度至同一个容器
[root@master manifests]# kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'
service/myapp patched
[root@lotus ~]# while true; do curl http://192.168.88.101:30080/hostname.html; sleep 1;done
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
myapp-deploy-5cf7978485-b4sdw
Headless Service无头服务
apiVersion: v1
kind: Service
metadata:
name: myapp-headless
namespace: default
spec:
selector:
app: myapp
release: tye
clusterIP: None
ports:
- port: 80
targetPort: 80
[root@master manifests]# kubectl apply -f myapp-svc-headless.yaml
service/myapp-headless created
[root@master manifests]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d23h
myapp NodePort 10.99.99.99 <none> 80:30080/TCP 31m
myapp-headless ClusterIP None <none> 80/TCP 4s
nginx NodePort 10.105.125.19 <none> 80:31526/TCP 5d
redis ClusterIP 10.97.97.97 <none> 6379/TCP 59m
#查看service解析情况
[root@master manifests]# dig -t A myapp-headless.default.svc.cluster.local. @10.96.0.10
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.7 <<>> -t A myapp-headless.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1280
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-headless.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp-headless.default.svc.cluster.local. 30 IN A 10.244.3.47
myapp-headless.default.svc.cluster.local. 30 IN A 10.244.3.49
myapp-headless.default.svc.cluster.local. 30 IN A 10.244.3.46
;; Query time: 0 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Fri Nov 12 09:58:24 EST 2021
;; MSG SIZE rcvd: 237
[root@master manifests]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp-deploy-5cf7978485-b4sdw 1/1 Running 1 (87m ago) 23h 10.244.3.47 node1 <none> <none>
myapp-deploy-5cf7978485-gsppv 1/1 Running 1 (87m ago) 23h 10.244.3.46 node1 <none> <none>
myapp-deploy-5cf7978485-jwvtl 1/1 Running 1 (87m ago) 23h 10.244.3.49 node1 <none> <none>
myapp-ds-9lw8z 1/1 Running 1 (87m ago) 23h 10.244.1.36 node2 <none> <none>
myapp-ds-n54vw 1/1 Running 1 (87m ago) 23h 10.244.3.48 node1 <none> <none>
nginx 1/1 Running 6 (87m ago) 5d14h 10.244.1.37 node2 <none> <none>
redis-56fd57fd76-lcndb 1/1 Running 1 (87m ago) 23h 10.244.1.35 node2 <none> <none>
通过启动一个Pod来访问service服务
#创建一个nginx-Pod
[root@master manifests]# kubectl create deployment nginx-deploy --image=nginx:1.14-alpine --replicas=1
deployment.apps/nginx-deploy created
#创建一个services通过8080暴露nginx容器的80端口
[root@master manifests]# kubectl expose deployment nginx-deploy --name nginx --port=8080 --target-port=80
service/nginx exposed
[root@master manifests]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9h
nginx ClusterIP 10.101.109.69 <none> 8080/TCP 5s
[root@master manifests]# kubectl run client --image=busybox -it --restart=Never
If you don't see a command prompt, try pressing enter.
/ #
/ # wget -O - -q nginx:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>