1.vim redis-svc.yaml创建资源文件。kubectl apply -f redis-svc.yaml声明资源。kubectl describe svc redis查看svc资源详细信息。
[root@master manifests]# vim redis-svc.yaml
[root@master manifests]# cat redis-svc.yaml
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 4d
redis ClusterIP 10.97.97.97 <none> 6379/TCP 5s
[root@master manifests]# kubectl describe svc redis
Name: redis
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"redis","namespace":"default"},"spec":{"clusterIP":"10.97.97.97","ports":[{"por...
Selector: app=redis,role=logstor
Type: ClusterIP
IP: 10.97.97.97
Port: <unset> 6379/TCP
TargetPort: 6379/TCP
Endpoints: 10.244.1.45:6379
Session Affinity: None
Events: <none>
2.vim myapp-svc.yaml创建资源文件(特别注意:这里的selector:一定要写对并反复确认,否则后面)。kubectl apply -f myapp-svc.yaml声明资源。kubectl describe svc myapp查看服务的详细信息。while true;do curl http://172.20.0.128:30080/hostname.html; sleep 1; done进行网络访问测试,可以看到转发不固定pod(这时因为默认是"sessionAffinity":"None")。
[root@master manifests]# cp redis-svc.yaml myapp-svc.yaml
[root@master manifests]# vim myapp-svc.yaml
[root@master manifests]# cat myapp-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
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
[root@master manifests]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4d
myapp NodePort 10.99.99.99 <none> 80:30080/TCP 3s
redis ClusterIP 10.97.97.97 <none> 6379/TCP 1h
[root@master manifests]# kubectl describe svc myapp
Name: myapp
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"myapp","namespace":"default"},"spec":{"clusterIP":"10.99.99.99","ports":[{"nod...
Selector: app=myapp,release=canary
Type: NodePort
IP: 10.99.99.99
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.244.1.41:80,10.244.1.42:80,10.244.1.43:80 + 2 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
[root@node1 ~]# while true;do curl http://172.20.0.128:30080/hostname.html; sleep 1; done
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-26xqh
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-26xqh
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-nw66w
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-nw66w
myapp-deploy-69b47bc96d-nw66w
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-26xqh
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-26xqh
myapp-deploy-69b47bc96d-pq57k
3."sessionAffinity":"ClientIP"的作用。kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'对服务的参数进行修改。kubectl describe svc myapp查看服务的详细信息。while true;do curl http://172.20.0.128:30080/hostname.html; sleep 1; done进行网络访问测试,可以看到转发固定pod。
[root@master manifests]# kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'
service/myapp patched
[root@master manifests]# kubectl describe svc myapp
Name: myapp
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"myapp","namespace":"default"},"spec":{"clusterIP":"10.99.99.99","ports":[{"nod...
Selector: app=myapp,release=canary
Type: NodePort
IP: 10.99.99.99
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.244.1.41:80,10.244.1.42:80,10.244.1.43:80 + 2 more...
Session Affinity: ClientIP
External Traffic Policy: Cluster
Events: <none>
[root@node1 ~]# while true;do curl http://172.20.0.128:30080/hostname.html; sleep 1; done
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-5lv7k
4."sessionAffinity":"None"的作用。kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}'对服务的参数进行修改。kubectl describe svc myapp查看服务的详细信息。while true;do curl http://172.20.0.128:30080/hostname.html; sleep 1; done进行网络访问测试,可以看到转发不固定pod。
[root@master manifests]# kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}'
service/myapp patched
[root@master manifests]# kubectl describe svc myapp
Name: myapp
Namespace: default
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"myapp","namespace":"default"},"spec":{"clusterIP":"10.99.99.99","ports":[{"nod...
Selector: app=myapp,release=canary
Type: NodePort
IP: 10.99.99.99
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30080/TCP
Endpoints: 10.244.1.41:80,10.244.1.42:80,10.244.1.43:80 + 2 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
[root@node1 ~]# while true;do curl http://172.20.0.128:30080/hostname.html; sleep 1; done
myapp-deploy-69b47bc96d-26xqh
myapp-deploy-69b47bc96d-26xqh
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-pq57k
myapp-deploy-69b47bc96d-5lv7k
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-nw66w
myapp-deploy-69b47bc96d-nw66w
myapp-deploy-69b47bc96d-lts6j
myapp-deploy-69b47bc96d-26xqh
5.vim myapp-svc-headless.yaml创建资源文件。vim myapp-svc-headless.yaml声明资源。kubectl get svc获取服务信息。 dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10对服务进行解析。kubectl get svc -n kube-system获取kube-dns解析服务的地址。kubectl get pods -o wide -l app=myapp查看pod的地址信息与服务解析的地址信息对比进行确认。dig -t A myapp.default.svc.cluster.local. @10.96.0.10对服务进行解析,这次只能解析到myapp.default.svc.cluster.local. 5 IN A 10.99.99.99即CLUSTER-IP(service服务),无法解析到Pod。
[root@master manifests]# cp myapp-svc.yaml myapp-svc-headless.yaml
[root@master manifests]# vim myapp-svc-headless.yaml
[root@master manifests]# cat myapp-svc-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
namespace: default
spec:
selector:
app: myapp
release: canary
clusterIP: None
ports:
- port: 80
targetPort: 80
[root@master manifests]# kubectl apply -f myapp-svc-headless.yaml
service/myapp-svc 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 4d
myapp NodePort 10.99.99.99 <none> 80:30080/TCP 15m
myapp-svc ClusterIP None <none> 80/TCP 6s
redis ClusterIP 10.97.97.97 <none> 6379/TCP 1h
[root@master manifests]# dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A myapp-svc.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49752
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-svc.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp-svc.default.svc.cluster.local. 5 IN A 10.244.1.41
myapp-svc.default.svc.cluster.local. 5 IN A 10.244.1.42
myapp-svc.default.svc.cluster.local. 5 IN A 10.244.1.43
myapp-svc.default.svc.cluster.local. 5 IN A 10.244.2.46
myapp-svc.default.svc.cluster.local. 5 IN A 10.244.2.47
;; Query time: 0 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Tue Dec 11 09:17:21 EST 2018
;; MSG SIZE rcvd: 319
[root@master manifests]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 4d
[root@master manifests]# kubectl get pods -o wide -l app=myapp
NAME READY STATUS RESTARTS AGE IP NODE
myapp-deploy-69b47bc96d-26xqh 1/1 Running 0 4h 10.244.1.42 node1.example.com
myapp-deploy-69b47bc96d-5lv7k 1/1 Running 0 4h 10.244.1.41 node1.example.com
myapp-deploy-69b47bc96d-lts6j 1/1 Running 0 4h 10.244.2.46 node2.example.com
myapp-deploy-69b47bc96d-nw66w 1/1 Running 0 4h 10.244.2.47 node2.example.com
myapp-deploy-69b47bc96d-pq57k 1/1 Running 0 4h 10.244.1.43 node1.example.com
[root@master manifests]# dig -t A myapp.default.svc.cluster.local. @10.96.0.10
; <<>> DiG 9.9.4-RedHat-9.9.4-72.el7 <<>> -t A myapp.default.svc.cluster.local. @10.96.0.10
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40394
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp.default.svc.cluster.local. IN A
;; ANSWER SECTION:
myapp.default.svc.cluster.local. 5 IN A 10.99.99.99
;; Query time: 0 msec
;; SERVER: 10.96.0.10#53(10.96.0.10)
;; WHEN: Tue Dec 11 09:18:59 EST 2018
;; MSG SIZE rcvd: 107