k8s基礎概念之二 service
阿新 • • 發佈:2021-12-16
什麼是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>
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埠的欄位