說明
服務內部的訪問
service如何訪問到pod
1.訪問到service(創建service如果指定了selector會自動創建對應的endpoint)
2.找到對應的endpoint
3.通過iptables找到路由到對應節點的kube-proxy
4.通過kube-proxy路由到對應的pod
如何定義一個sevice
apiVersion: v1 kind: Service metadata: name: "order" namespace: "test" spec: selector: app: "order" type: ClusterIP ports: - name: order-http port: 8000 targetPort: 8000 - name: order-grpc port: 8001 targetPort: 8001
apiVersion: v1 kind: Service metadata: name: my-service # 服務的名稱 spec: selector: app: my-app # 選擇器,指定服務所匹配的Pod ports: - protocol: TCP # 服務使用的協議 port: 80 # 服務暴露的端口 targetPort: 8080 # 服務轉發到Pod的端口 type: NodePort # 服務的類型,可以是NodePort、ClusterIP、LoadBalancer等 # 以下是可選的配置 # loadBalancerIP: 192.168.1.100 # 如果服務類型爲LoadBalancer,可以指定負載均衡器的IP # externalTrafficPolicy: Local # 控制流量的策略,可以是Local或者Cluster
相關命令
根據yml創建service
kubectl apply -f service.yaml
查看所有service: kubectl get services 查看特定service的詳細信息: kubectl describe service <service-name> 刪除一個service: kubectl delete service <service-name> 編輯一個service: kubectl edit service <service-name> 替換一個service,通過新的YAML文件: kubectl replace -f <new-service-definition.yaml>
如何跨命名空間訪問
wget http://nginx-svc.{namespace}
如果自定義endpint
應用場景,轉發請求到外部、比如遷移應用到k8s 一部分應用是k8s 一部分非k8s
apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 8080
apiVersion: v1 kind: Endpoints metadata: name: my-service 與service一致 subsets: - addresses: - ip: 192.168.1.1 # 轉發的地址 ports: - port: 8080 # 替換爲你的Pod的端口
kubectl apply -f service.yaml
kubectl apply -f endpoints.yaml
service如何代理到域名
apiVersion: v1 kind: Service metadata: name: my-external-service spec: type: ExternalName externalName: example.com # 將此處替換爲你的域名 ports: - port: 80
屬性介紹
type
ClusterIp 集羣內部使用 轉發ip(默認)
ExternalName 域名方式
NodePort
LoadBalancer