1. 程式人生 > 其它 >k8s基礎概念之二 service

k8s基礎概念之二 service

什麼是service:

service可以理解為邏輯上的一組Pod(一個應用),一組可以訪問pod的策略,而且其他pod可以通過這個service訪問到這個service代理的Pod。相對於pod而言,他會有一個固定的名稱,一旦建立就固定不變

定義一個service

apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx01
  name: test
spec:
  ports:
  - name: dns      #service埠的名稱
    port: 80       #service 自己的埠
    protocol: TCP  #協議
    targetPort: 
80 #後端應用埠 - name: https port: 443 protocol: TCP targetPort: 443 selector: #過濾標籤,Labels,如果寫多個,則多個標籤都要匹配 app: nginx01 sessionAffinity: None type: NodePort

因為ip是隨時會變的,所以建議使用名字來訪問

注:

如果在同一個namespace下訪問直接http://servicename即可,如果不在同一個名稱空間則需要加上名稱空間,例如:curl http://nginx-svc.default

,儘量少用,

使用k8s代理外部服務

 # 手動定義一個service
 apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx-svc-ex
  name: nginx-svc-ex
spec:
  ports:
  - name: http      #service埠的名稱
    port: 80       #service 自己的埠
    protocol: TCP  #協議
    targetPort: 80 #後端應用埠
  sessionAffinity: None
  type: ClusterIP
  #和其他service不同的是,這個不需要標籤過濾


#在yaml中 --- 為兩個檔案的分隔符
--- #這個不會自動生成endpoint,需要我們手動生成 apiVersion: v1 kind: Endpoints metadata: labels: app: nginx-svc-ex #和service定義時候的名稱要一致 name: nginx-svc-ex subsets: - addresses: - ip: 220.181.38.251 #需要代理的外部ip ports: - name: http #這個名稱和service定義協議埠的名稱也要一致 port: 80 protocol: TCP #endpoint和service的名稱協議全部要一致,要不然他會沒辦法建立連結

測試:

[root@master01 yaml]# kubectl get svc
NAME           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes     ClusterIP   10.96.0.1     <none>        443/TCP   5d12h
nginx-svc-ex   ClusterIP   10.96.78.49   <none>        80/TCP    8s
[root@master01 yaml]# kubectl get ep
NAME           ENDPOINTS                           AGE
kubernetes     172.16.1.11:6443,172.16.1.12:6443   5d12h
nginx-svc-ex   220.181.38.251:80                   6s
[root@master01 yaml]# curl 220.181.38.251:80   #測試外部連結
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
[root@master01 yaml]# curl 10.96.78.49          #測試我們所代理的連結,發現返回都是一樣的
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>

service反代外部域名

apiVersion: v1
kind: Service
metadata:
  labels:
    app: svc-ex-s
  name: svc-ex-s
spec:
  type: ExternalName
  externalName: www.baidu.com
  
測試:
[root@master01 yaml]# kubectl run busybox --rm=true --image=busybox --restart=Never -it
/ # wget svc-ex-s
Connecting to svc-ex-s (112.80.248.75:80)
wget: server returned error: HTTP/1.1 403 Forbidden

#因為存在跨域問題,所以

service型別

ClusterIP:只是在叢集內部使用 ,預設值
NodePort:在所有安裝了kube-proxy的節點上打開了一個埠,外部埠對映到叢集內,可以對外提供服務(埠預設30000-32767)
ExternalName:通過返回自定義的CNAME別名

自定義service埠範圍

NodePort預設的埠是可以改的:
二進位制:
[root@master01 yaml]# cat /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/cfg/kube-apiserver.conf
ExecStart=/usr/local/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
RestartSec=10
Type=notify
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target

[root@master01 yaml]# cat /etc/kubernetes/cfg/kube-apiserver.conf
KUBE_APISERVER_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/var/log/kubernetes \
--advertise-address=172.16.1.11 \
--default-not-ready-toleration-seconds=360 \
--default-unreachable-toleration-seconds=360 \
--max-mutating-requests-inflight=2000 \
--max-requests-inflight=4000 \
--default-watch-cache-size=200 \
--delete-collection-workers=2 \
--bind-address=0.0.0.0 \
--secure-port=6443 \
--allow-privileged=true \
--service-cluster-ip-range=10.96.0.0/16 \
--service-node-port-range=10000-52767 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth=true \
--token-auth-file=/etc/kubernetes/cfg/token.csv \
--kubelet-client-certificate=/etc/kubernetes/ssl/server.pem \
--kubelet-client-key=/etc/kubernetes/ssl/server-key.pem \
--tls-cert-file=/etc/kubernetes/ssl/server.pem  \
--tls-private-key-file=/etc/kubernetes/ssl/server-key.pem \
--client-ca-file=/etc/kubernetes/ssl/ca.pem \
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/var/log/kubernetes/k8s-audit.log \
--etcd-servers=https://172.16.1.11:2379,https://172.16.1.12:2379,https://172.16.1.13:2379 \
--etcd-cafile=/etc/etcd/ssl/ca.pem \
--etcd-certfile=/etc/etcd/ssl/etcd.pem \
--etcd-keyfile=/etc/etcd/ssl/etcd-key.pem"

#--service-node-port-range就是自定義service埠的欄位