{"id":1648,"date":"2020-06-22T01:10:41","date_gmt":"2020-06-21T17:10:41","guid":{"rendered":"http:\/\/39.97.231.10\/?p=1648"},"modified":"2020-06-22T01:10:41","modified_gmt":"2020-06-21T17:10:41","slug":"kubernetes%e5%ba%94%e7%94%a8%e8%bf%9e%e6%8e%a5%e5%88%b0-service","status":"publish","type":"post","link":"http:\/\/www.weijing.co\/?p=1648","title":{"rendered":"Kubernetes\u5e94\u7528\u8fde\u63a5\u5230 Service"},"content":{"rendered":"<h2 id=\\\"kubernetes-\u8fde\u63a5\u5bb9\u5668\u6a21\u578b\\\">Kubernetes \u8fde\u63a5\u5bb9\u5668\u6a21\u578b<\/h2>\n<p>\u65e2\u7136\u6709\u4e86\u4e00\u4e2a\u6301\u7eed\u8fd0\u884c\u3001\u53ef\u590d\u5236\u7684\u5e94\u7528\uff0c\u6211\u4eec\u5c31\u80fd\u591f\u5c06\u5b83\u66b4\u9732\u5230\u7f51\u7edc\u4e0a\u3002 \u5728\u8ba8\u8bba Kubernetes \u7f51\u7edc\u8fde\u63a5\u7684\u65b9\u5f0f\u4e4b\u524d\uff0c\u975e\u5e38\u503c\u5f97\u4e0e Docker \u4e2d \u201c\u6b63\u5e38\u201d \u65b9\u5f0f\u7684\u7f51\u7edc\u8fdb\u884c\u5bf9\u6bd4\u3002<br \/>\n\u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0cDocker \u4f7f\u7528\u79c1\u6709\u4e3b\u673a\u7f51\u7edc\u8fde\u63a5\uff0c\u53ea\u80fd\u4e0e\u540c\u5728\u4e00\u53f0\u673a\u5668\u4e0a\u7684\u5bb9\u5668\u8fdb\u884c\u901a\u4fe1\u3002 \u4e3a\u4e86\u5b9e\u73b0\u5bb9\u5668\u7684\u8de8\u8282\u70b9\u901a\u4fe1\uff0c\u5fc5\u987b\u5728\u673a\u5668\u81ea\u5df1\u7684 IP \u4e0a\u4e3a\u8fd9\u4e9b\u5bb9\u5668\u5206\u914d\u7aef\u53e3\uff0c\u4e3a\u5bb9\u5668\u8fdb\u884c\u7aef\u53e3\u8f6c\u53d1\u6216\u8005\u4ee3\u7406\u3002<br \/>\n\u591a\u4e2a\u5f00\u53d1\u4eba\u5458\u4e4b\u95f4\u534f\u8c03\u7aef\u53e3\u7684\u4f7f\u7528\u5f88\u96be\u505a\u5230\u89c4\u6a21\u5316\uff0c\u90a3\u4e9b\u96be\u4ee5\u63a7\u5236\u7684\u96c6\u7fa4\u7ea7\u522b\u7684\u95ee\u9898\uff0c\u90fd\u4f1a\u4ea4\u7531\u7528\u6237\u81ea\u5df1\u53bb\u5904\u7406\u3002 Kubernetes \u5047\u8bbe Pod \u53ef\u4e0e\u5176\u5b83 Pod \u901a\u4fe1\uff0c\u4e0d\u7ba1\u5b83\u4eec\u5728\u54ea\u4e2a\u4e3b\u673a\u4e0a\u3002 \u6211\u4eec\u7ed9 Pod \u5206\u914d\u5c5e\u4e8e\u81ea\u5df1\u7684\u96c6\u7fa4\u79c1\u6709 IP \u5730\u5740\uff0c\u6240\u4ee5\u6ca1\u5fc5\u8981\u5728 Pod \u6216\u6620\u5c04\u5230\u7684\u5bb9\u5668\u7684\u7aef\u53e3\u548c\u4e3b\u673a\u7aef\u53e3\u4e4b\u95f4\u663e\u5f0f\u5730\u521b\u5efa\u8fde\u63a5\u3002 \u8fd9\u8868\u660e\u4e86\u5728 Pod \u5185\u7684\u5bb9\u5668\u90fd\u80fd\u591f\u8fde\u63a5\u5230\u672c\u5730\u7684\u6bcf\u4e2a\u7aef\u53e3\uff0c\u96c6\u7fa4\u4e2d\u7684\u6240\u6709 Pod \u4e0d\u9700\u8981\u901a\u8fc7 NAT \u8f6c\u6362\u5c31\u80fd\u591f\u4e92\u76f8\u770b\u5230\u3002 \u6587\u6863\u7684\u5269\u4f59\u90e8\u5206\u5c06\u8be6\u8ff0\u5982\u4f55\u5728\u4e00\u4e2a\u7f51\u7edc\u6a21\u578b\u4e4b\u4e0a\u8fd0\u884c\u53ef\u9760\u7684\u670d\u52a1\u3002<br \/>\n\u8be5\u6307\u5357\u4f7f\u7528\u4e00\u4e2a\u7b80\u5355\u7684 Nginx server \u6765\u6f14\u793a\u5e76\u8bc1\u660e\u8c08\u5230\u7684\u6982\u5ff5\u3002\u540c\u6837\u7684\u539f\u5219\u4e5f\u4f53\u73b0\u5728\u4e00\u4e2a\u66f4\u52a0\u5b8c\u6574\u7684\u00a0Jenkins CI \u5e94\u7528\u00a0\u4e2d\u3002<\/p>\n<h2 id=\\\"\u5728\u96c6\u7fa4\u4e2d\u66b4\u9732-pod\\\">\u5728\u96c6\u7fa4\u4e2d\u66b4\u9732 Pod<\/h2>\n<p>\u6211\u4eec\u5728\u4e4b\u524d\u7684\u793a\u4f8b\u4e2d\u5df2\u7ecf\u505a\u8fc7\uff0c\u7136\u800c\u518d\u8ba9\u6211\u91cd\u8bd5\u4e00\u6b21\uff0c\u8fd9\u6b21\u805a\u7126\u5728\u7f51\u7edc\u8fde\u63a5\u7684\u89c6\u89d2\u3002 \u521b\u5efa\u4e00\u4e2a Nginx Pod\uff0c\u6307\u793a\u5b83\u5177\u6709\u4e00\u4e2a\u5bb9\u5668\u7aef\u53e3\u7684\u8bf4\u660e\uff1a<\/p>\n<table id=\\\"service-networking-run-my-nginx-yaml\\\">\n<thead>\n<tr>\n<th><a href=\\\"https:\/\/raw.githubusercontent.com\/kubernetes\/website\/master\/content\/zh\/examples\/service\/networking\/run-my-nginx.yaml\\\" download=\\\"service\/networking\/run-my-nginx.yaml\\\">service\/networking\/run-my-nginx.yaml<\/a>\u00a0<img title=\\\"Copy service\/networking\/run-my-nginx.yaml to clipboard\\\" src=\\\"https:\/\/d33wubrfki0l68.cloudfront.net\/951ae1fcc65e28202164b32c13fa7ae04fab4a0b\/b77dc\/images\/copycode.svg\\\" \/><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<div>\n<pre>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: my-nginx\nspec:\n  selector:\n    matchLabels:\n      run: my-nginx\n  replicas: 2\n  template:\n    metadata:\n      labels:\n        run: my-nginx\n    spec:\n      containers:\n      - name: my-nginx\n        image: nginx\n        ports:\n        - containerPort: 80\n<\/pre>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8fd9\u4f7f\u5f97\u53ef\u4ee5\u4ece\u96c6\u7fa4\u4e2d\u4efb\u4f55\u4e00\u4e2a\u8282\u70b9\u6765\u8bbf\u95ee\u5b83\u3002\u68c0\u67e5\u8282\u70b9\uff0c\u8be5 Pod \u6b63\u5728\u8fd0\u884c\uff1a<\/p>\n<div>\n<pre>kubectl apply -f .\/run-my-nginx.yaml\nkubectl get pods -l run=my-nginx -o wide\n<\/pre>\n<\/div>\n<pre>NAME                        READY     STATUS    RESTARTS   AGE       IP            NODE\nmy-nginx-3800858182-jr4a2   1\/1       Running   0          13s       10.244.3.4    kubernetes-minion-905m\nmy-nginx-3800858182-kna2y   1\/1       Running   0          13s       10.244.2.5    kubernetes-minion-ljyd\n<\/pre>\n<p>\u68c0\u67e5 Pod \u7684 IP \u5730\u5740\uff1a<\/p>\n<div>\n<pre>kubectl get pods -l run=my-nginx -o yaml | grep podIP\n    podIP: 10.244.3.4\n    podIP: 10.244.2.5\n<\/pre>\n<\/div>\n<p>\u5e94\u8be5\u80fd\u591f\u901a\u8fc7 ssh \u767b\u5f55\u5230\u96c6\u7fa4\u4e2d\u7684\u4efb\u4f55\u4e00\u4e2a\u8282\u70b9\u4e0a\uff0c\u4f7f\u7528 curl \u4e5f\u80fd\u8c03\u901a\u6240\u6709 IP \u5730\u5740\u3002 \u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5bb9\u5668\u4e0d\u4f1a\u4f7f\u7528\u8be5\u8282\u70b9\u4e0a\u7684 80 \u7aef\u53e3\uff0c\u4e5f\u4e0d\u4f1a\u4f7f\u7528\u4efb\u4f55\u7279\u5b9a\u7684 NAT \u89c4\u5219\u53bb\u8def\u7531\u6d41\u91cf\u5230 Pod \u4e0a\u3002 \u8fd9\u610f\u5473\u7740\u53ef\u4ee5\u5728\u540c\u4e00\u4e2a\u8282\u70b9\u4e0a\u8fd0\u884c\u591a\u4e2a Pod\uff0c\u4f7f\u7528\u76f8\u540c\u7684\u5bb9\u5668\u7aef\u53e3\uff0c\u5e76\u4e14\u53ef\u4ee5\u4ece\u96c6\u7fa4\u4e2d\u4efb\u4f55\u5176\u4ed6\u7684 Pod \u6216\u8282\u70b9\u4e0a\u4f7f\u7528 IP \u7684\u65b9\u5f0f\u8bbf\u95ee\u5230\u5b83\u4eec\u3002 \u50cf Docker \u4e00\u6837\uff0c\u7aef\u53e3\u80fd\u591f\u88ab\u53d1\u5e03\u5230\u4e3b\u673a\u8282\u70b9\u7684\u63a5\u53e3\u4e0a\uff0c\u4f46\u662f\u51fa\u4e8e\u7f51\u7edc\u6a21\u578b\u7684\u539f\u56e0\u5e94\u8be5\u4ece\u6839\u672c\u4e0a\u51cf\u5c11\u8fd9\u79cd\u7528\u6cd5\u3002<br \/>\n\u5982\u679c\u5bf9\u6b64\u597d\u5947\uff0c\u53ef\u4ee5\u83b7\u53d6\u66f4\u591a\u5173\u4e8e\u00a0<a href=\\\"https:\/\/kubernetes.io\/docs\/concepts\/cluster-administration\/networking\/#how-to-achieve-this\\\">\u5982\u4f55\u5b9e\u73b0\u7f51\u7edc\u6a21\u578b<\/a>\u00a0\u7684\u5185\u5bb9\u3002<\/p>\n<h2 id=\\\"\u521b\u5efa-service\\\">\u521b\u5efa Service<\/h2>\n<p>\u6211\u4eec\u6709 Pod \u5728\u4e00\u4e2a\u6241\u5e73\u7684\u3001\u96c6\u7fa4\u8303\u56f4\u7684\u5730\u5740\u7a7a\u95f4\u4e2d\u8fd0\u884c Nginx \u670d\u52a1\uff0c\u53ef\u4ee5\u76f4\u63a5\u8fde\u63a5\u5230\u8fd9\u4e9b Pod\uff0c\u4f46\u5982\u679c\u67d0\u4e2a\u8282\u70b9\u6b7b\u6389\u4e86\u4f1a\u53d1\u751f\u4ec0\u4e48\u5462\uff1f Pod \u4f1a\u7ec8\u6b62\uff0cDeployment \u5c06\u521b\u5efa\u65b0\u7684 Pod\uff0c\u4e14\u4f7f\u7528\u4e0d\u540c\u7684 IP\u3002\u8fd9\u6b63\u662f Service \u8981\u89e3\u51b3\u7684\u95ee\u9898\u3002<br \/>\nKubernetes Service \u4ece\u903b\u8f91\u4e0a\u5b9a\u4e49\u4e86\u8fd0\u884c\u5728\u96c6\u7fa4\u4e2d\u7684\u4e00\u7ec4 Pod\uff0c\u8fd9\u4e9b Pod \u63d0\u4f9b\u4e86\u76f8\u540c\u7684\u529f\u80fd\u3002 \u5f53\u6bcf\u4e2a Service \u521b\u5efa\u65f6\uff0c\u4f1a\u88ab\u5206\u914d\u4e00\u4e2a\u552f\u4e00\u7684 IP \u5730\u5740\uff08\u4e5f\u79f0\u4e3a clusterIP\uff09\u3002 \u8fd9\u4e2a IP \u5730\u5740\u4e0e\u4e00\u4e2a Service \u7684\u751f\u547d\u5468\u671f\u7ed1\u5b9a\u5728\u4e00\u8d77\uff0c\u5f53 Service \u5b58\u5728\u7684\u65f6\u5019\u5b83\u4e5f\u4e0d\u4f1a\u6539\u53d8\u3002 \u53ef\u4ee5\u914d\u7f6e Pod \u4f7f\u5b83\u4e0e Service \u8fdb\u884c\u901a\u4fe1\uff0cPod \u77e5\u9053\u4e0e Service \u901a\u4fe1\u5c06\u88ab\u81ea\u52a8\u5730\u8d1f\u8f7d\u5747\u8861\u5230\u8be5 Service \u4e2d\u7684\u67d0\u4e9b Pod \u4e0a\u3002<br \/>\n\u53ef\u4ee5\u4f7f\u7528\u00a0kubectl expose\u00a0\u547d\u4ee4\u4e3a 2\u4e2a Nginx \u526f\u672c\u521b\u5efa\u4e00\u4e2a Service\uff1a<\/p>\n<div>\n<pre>kubectl expose deployment\/my-nginx\n<\/pre>\n<\/div>\n<pre>service\/my-nginx exposed\n<\/pre>\n<p>\u8fd9\u7b49\u4ef7\u4e8e\u4f7f\u7528\u00a0kubectl create -f\u00a0\u547d\u4ee4\u521b\u5efa\uff0c\u5bf9\u5e94\u5982\u4e0b\u7684 yaml \u6587\u4ef6\uff1a<\/p>\n<table id=\\\"service-networking-nginx-svc-yaml\\\">\n<thead>\n<tr>\n<th><a href=\\\"https:\/\/raw.githubusercontent.com\/kubernetes\/website\/master\/content\/zh\/examples\/service\/networking\/nginx-svc.yaml\\\" download=\\\"service\/networking\/nginx-svc.yaml\\\">service\/networking\/nginx-svc.yaml<\/a>\u00a0<img title=\\\"Copy service\/networking\/nginx-svc.yaml to clipboard\\\" src=\\\"https:\/\/d33wubrfki0l68.cloudfront.net\/951ae1fcc65e28202164b32c13fa7ae04fab4a0b\/b77dc\/images\/copycode.svg\\\" \/><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<div>\n<pre>apiVersion: v1\nkind: Service\nmetadata:\n  name: my-nginx\n  labels:\n    run: my-nginx\nspec:\n  ports:\n  - port: 80\n    protocol: TCP\n  selector:\n    run: my-nginx\n<\/pre>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e0a\u8ff0\u89c4\u7ea6\u5c06\u521b\u5efa\u4e00\u4e2a Service\uff0c\u5bf9\u5e94\u5177\u6709\u6807\u7b7e\u00a0run: my-nginx\u00a0\u7684 Pod\uff0c\u76ee\u6807 TCP \u7aef\u53e3 80\uff0c\u5e76\u4e14\u5728\u4e00\u4e2a\u62bd\u8c61\u7684 Service \u7aef\u53e3\uff08targetPort\uff1a\u5bb9\u5668\u63a5\u6536\u6d41\u91cf\u7684\u7aef\u53e3\uff1bport\uff1a\u62bd\u8c61\u7684 Service \u7aef\u53e3\uff0c\u53ef\u4ee5\u4f7f\u4efb\u4f55\u5176\u5b83 Pod \u8bbf\u95ee\u8be5 Service \u7684\u7aef\u53e3\uff09\u4e0a\u66b4\u9732\u3002 \u67e5\u770b\u00a0<a href=\\\"https:\/\/kubernetes.io\/docs\/api-reference\/v1.18\/#service-v1-core\\\">Service API \u5bf9\u8c61<\/a>\u00a0\u4e86\u89e3 Service \u5b9a\u4e49\u652f\u6301\u7684\u5b57\u6bb5\u5217\u8868\u3002 \u67e5\u770b\u4f60\u7684 Service \u8d44\u6e90:<\/p>\n<div>\n<pre>kubectl get svc my-nginx\n<\/pre>\n<\/div>\n<pre>NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE\nmy-nginx   ClusterIP   10.0.162.149   &lt;none&gt;        80\/TCP    21s\n<\/pre>\n<p>\u6b63\u5982\u524d\u9762\u6240\u63d0\u5230\u7684\uff0c\u4e00\u4e2a Service \u7531\u4e00\u7ec4 backend Pod \u7ec4\u6210\u3002\u8fd9\u4e9b Pod \u901a\u8fc7\u00a0endpoints\u00a0\u66b4\u9732\u51fa\u6765\u3002 Service Selector \u5c06\u6301\u7eed\u8bc4\u4f30\uff0c\u7ed3\u679c\u88ab POST \u5230\u4e00\u4e2a\u540d\u79f0\u4e3a\u00a0my-nginx\u00a0\u7684 Endpoint \u5bf9\u8c61\u4e0a\u3002 \u5f53 Pod \u7ec8\u6b62\u540e\uff0c\u5b83\u4f1a\u81ea\u52a8\u4ece Endpoint \u4e2d\u79fb\u9664\uff0c\u65b0\u7684\u80fd\u591f\u5339\u914d\u4e0a Service Selector \u7684 Pod \u5c06\u81ea\u52a8\u5730\u88ab\u6dfb\u52a0\u5230 Endpoint \u4e2d\u3002 \u68c0\u67e5\u8be5 Endpoint\uff0c\u6ce8\u610f\u5230 IP \u5730\u5740\u4e0e\u5728\u7b2c\u4e00\u6b65\u521b\u5efa\u7684 Pod \u662f\u76f8\u540c\u7684\u3002<\/p>\n<div>\n<pre>kubectl describe svc my-nginx\n<\/pre>\n<\/div>\n<pre>Name:                my-nginx\nNamespace:           default\nLabels:              run=my-nginx\nAnnotations:         &lt;none&gt;\nSelector:            run=my-nginx\nType:                ClusterIP\nIP:                  10.0.162.149\nPort:                &lt;unset&gt; 80\/TCP\nEndpoints:           10.244.2.5:80,10.244.3.4:80\nSession Affinity:    None\nEvents:              &lt;none&gt;\n<\/pre>\n<div>\n<pre>kubectl get ep my-nginx\n<\/pre>\n<\/div>\n<pre>NAME       ENDPOINTS                     AGE\nmy-nginx   10.244.2.5:80,10.244.3.4:80   1m\n<\/pre>\n<p>\u73b0\u5728\uff0c\u80fd\u591f\u4ece\u96c6\u7fa4\u4e2d\u4efb\u610f\u8282\u70b9\u4e0a\u4f7f\u7528 curl \u547d\u4ee4\u8bf7\u6c42 Nginx Service\u00a0&lt;CLUSTER-IP&gt;:&lt;PORT&gt;\u00a0\u3002 \u6ce8\u610f Service IP \u5b8c\u5168\u662f\u865a\u62df\u7684\uff0c\u5b83\u4ece\u6765\u6ca1\u6709\u8d70\u8fc7\u7f51\u7edc\uff0c\u5982\u679c\u5bf9\u5b83\u5982\u4f55\u5de5\u4f5c\u7684\u539f\u7406\u611f\u5230\u597d\u5947\uff0c \u53ef\u4ee5\u9605\u8bfb\u66f4\u591a\u5173\u4e8e\u00a0<a href=\\\"https:\/\/kubernetes.io\/docs\/user-guide\/services\/#virtual-ips-and-service-proxies\\\">\u670d\u52a1\u4ee3\u7406<\/a>\u00a0\u7684\u5185\u5bb9\u3002<\/p>\n<h2 id=\\\"\u8bbf\u95ee-service\\\">\u8bbf\u95ee Service<\/h2>\n<p>Kubernetes\u652f\u6301\u4e24\u79cd\u67e5\u627e\u670d\u52a1\u7684\u4e3b\u8981\u6a21\u5f0f: \u73af\u5883\u53d8\u91cf\u548cDNS\u3002 \u524d\u8005\u5f00\u7bb1\u5373\u7528\uff0c\u800c\u540e\u8005\u5219\u9700\u8981[CoreDNS\u96c6\u7fa4\u63d2\u4ef6]\u00a0<a href=\\\"http:\/\/releases.k8s.io\/master\/cluster\/addons\/dns\/coredns\\\">CoreDNS \u96c6\u7fa4\u63d2\u4ef6<\/a>.<\/p>\n<blockquote>\n<div>\u6ce8\u610f\uff1a\u00a0\u5982\u679c\u4e0d\u9700\u8981\u670d\u52a1\u73af\u5883\u53d8\u91cf\uff08\u56e0\u4e3a\u53ef\u80fd\u4e0e\u9884\u671f\u7684\u7a0b\u5e8f\u51b2\u7a81\uff0c\u53ef\u80fd\u8981\u5904\u7406\u7684\u53d8\u91cf\u592a\u591a\uff0c\u6216\u8005\u4ec5\u4f7f\u7528DNS\u7b49\uff09\uff0c\u5219\u53ef\u4ee5\u901a\u8fc7\u5728 [pod spec](\/docs\/reference\/generated\/kubernetes-api\/v1.18\/#pod-v1-core)\u4e0a\u5c06 `enableServiceLinks` \u6807\u5fd7\u8bbe\u7f6e\u4e3a `false` \u6765\u7981\u7528\u6b64\u6a21\u5f0f\u3002<\/div>\n<\/blockquote>\n<h3 id=\\\"\u73af\u5883\u53d8\u91cf\\\">\u73af\u5883\u53d8\u91cf<\/h3>\n<p>\u5f53 Pod \u5728 Node \u4e0a\u8fd0\u884c\u65f6\uff0ckubelet \u4f1a\u4e3a\u6bcf\u4e2a\u6d3b\u8dc3\u7684 Service \u6dfb\u52a0\u4e00\u7ec4\u73af\u5883\u53d8\u91cf\u3002 \u8fd9\u4f1a\u6709\u4e00\u4e2a\u987a\u5e8f\u7684\u95ee\u9898\u3002\u60f3\u4e86\u89e3\u4e3a\u4f55\uff0c\u68c0\u67e5\u6b63\u5728\u8fd0\u884c\u7684 Nginx Pod \u7684\u73af\u5883\u53d8\u91cf\uff08Pod \u540d\u79f0\u5c06\u4e0d\u4f1a\u76f8\u540c\uff09\uff1a<\/p>\n<div>\n<pre>kubectl exec my-nginx-3800858182-jr4a2 -- printenv | grep SERVICE\n<\/pre>\n<\/div>\n<pre>KUBERNETES_SERVICE_HOST=10.0.0.1\nKUBERNETES_SERVICE_PORT=443\nKUBERNETES_SERVICE_PORT_HTTPS=443\n<\/pre>\n<p>\u6ce8\u610f\uff0c\u8fd8\u6ca1\u6709\u8c08\u53ca\u5230 Service\u3002\u8fd9\u662f\u56e0\u4e3a\u521b\u5efa\u526f\u672c\u5148\u4e8e Service\u3002 \u8fd9\u6837\u505a\u7684\u53e6\u4e00\u4e2a\u7f3a\u70b9\u662f\uff0c\u8c03\u5ea6\u5668\u53ef\u80fd\u5728\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u653e\u7f6e\u6240\u6709 Pod\uff0c\u5982\u679c\u8be5\u673a\u5668\u5b95\u673a\u5219\u6240\u6709\u7684 Service \u90fd\u4f1a\u6302\u6389\u3002 \u6b63\u786e\u7684\u505a\u6cd5\u662f\uff0c\u6211\u4eec\u6740\u6389 2 \u4e2a Pod\uff0c\u7b49\u5f85 Deployment \u53bb\u521b\u5efa\u5b83\u4eec\u3002 \u8fd9\u6b21 Service \u4f1a\u00a0\u5148\u4e8e\u00a0\u526f\u672c\u5b58\u5728\u3002\u8fd9\u5c06\u5b9e\u73b0\u8c03\u5ea6\u5668\u7ea7\u522b\u7684 Service\uff0c\u80fd\u591f\u4f7f Pod \u5206\u6563\u521b\u5efa\uff08\u5047\u5b9a\u6240\u6709\u7684 Node \u90fd\u5177\u6709\u540c\u6837\u7684\u5bb9\u91cf\uff09\uff0c\u4ee5\u53ca\u6b63\u786e\u7684\u73af\u5883\u53d8\u91cf\uff1a<\/p>\n<div>\n<pre>kubectl scale deployment my-nginx --replicas=0; kubectl scale deployment my-nginx --replicas=2;\nkubectl get pods -l run=my-nginx -o wide\n<\/pre>\n<\/div>\n<pre>NAME                        READY     STATUS    RESTARTS   AGE     IP            NODE\nmy-nginx-3800858182-e9ihh   1\/1       Running   0          5s      10.244.2.7    kubernetes-minion-ljyd\nmy-nginx-3800858182-j4rm4   1\/1       Running   0          5s      10.244.3.8    kubernetes-minion-905m\n<\/pre>\n<p>\u53ef\u80fd\u6ce8\u610f\u5230\uff0cPod \u5177\u6709\u4e0d\u540c\u7684\u540d\u79f0\uff0c\u56e0\u4e3a\u5b83\u4eec\u88ab\u6740\u6389\u540e\u5e76\u88ab\u91cd\u65b0\u521b\u5efa\u3002<\/p>\n<div>\n<pre>kubectl exec my-nginx-3800858182-e9ihh -- printenv | grep SERVICE\n<\/pre>\n<\/div>\n<pre>KUBERNETES_SERVICE_PORT=443\nMY_NGINX_SERVICE_HOST=10.0.162.149\nKUBERNETES_SERVICE_HOST=10.0.0.1\nMY_NGINX_SERVICE_PORT=80\nKUBERNETES_SERVICE_PORT_HTTPS=443\n<\/pre>\n<h3 id=\\\"dns\\\">DNS<\/h3>\n<p>Kubernetes \u63d0\u4f9b\u4e86\u4e00\u4e2a DNS \u63d2\u4ef6 Service\uff0c\u5b83\u4f7f\u7528 skydns \u81ea\u52a8\u4e3a\u5176\u5b83 Service \u6307\u6d3e DNS \u540d\u5b57\u3002 \u5982\u679c\u5b83\u5728\u96c6\u7fa4\u4e2d\u5904\u4e8e\u8fd0\u884c\u72b6\u6001\uff0c\u53ef\u4ee5\u901a\u8fc7\u5982\u4e0b\u547d\u4ee4\u6765\u68c0\u67e5\uff1a<\/p>\n<div>\n<pre>kubectl get services kube-dns --namespace=kube-system\n<\/pre>\n<\/div>\n<pre>NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)         AGE\nkube-dns   ClusterIP   10.0.0.10    &lt;none&gt;        53\/UDP,53\/TCP   8m\n<\/pre>\n<p>\u5982\u679c\u6ca1\u6709\u5728\u8fd0\u884c\uff0c\u53ef\u4ee5\u00a0<a href=\\\"http:\/\/releases.k8s.io\/master\/cluster\/addons\/dns\/kube-dns\/README.md#how-do-i-configure-it\\\">\u542f\u7528\u5b83<\/a>\u3002 \u672c\u6bb5\u5269\u4f59\u7684\u5185\u5bb9\uff0c\u5c06\u5047\u8bbe\u5df2\u7ecf\u6709\u4e00\u4e2a Service\uff0c\u5b83\u5177\u6709\u4e00\u4e2a\u957f\u4e45\u5b58\u5728\u7684 IP\uff08my-nginx\uff09\uff0c\u4e00\u4e2a\u4e3a\u8be5 IP \u6307\u6d3e\u540d\u79f0\u7684 DNS \u670d\u52a1\u5668\uff08kube-dns \u96c6\u7fa4\u63d2\u4ef6\uff09\uff0c\u6240\u4ee5\u53ef\u4ee5\u901a\u8fc7\u6807\u51c6\u505a\u6cd5\uff0c\u4f7f\u5728\u96c6\u7fa4\u4e2d\u7684\u4efb\u4f55 Pod \u90fd\u80fd\u4e0e\u8be5 Service \u901a\u4fe1\uff08\u4f8b\u5982\uff1agethostbyname\uff09\u3002 \u8ba9\u6211\u4eec\u8fd0\u884c\u53e6\u4e00\u4e2a curl \u5e94\u7528\u6765\u8fdb\u884c\u6d4b\u8bd5\uff1a<\/p>\n<div>\n<pre>kubectl run curl --image=radial\/busyboxplus:curl -i --tty\n<\/pre>\n<\/div>\n<pre>Waiting for pod default\/curl-131556218-9fnch to be running, status is Pending, pod ready: false\nHit enter for command prompt\n<\/pre>\n<p>\u7136\u540e\uff0c\u6309\u56de\u8f66\u5e76\u6267\u884c\u547d\u4ee4\u00a0nslookup my-nginx\uff1a<\/p>\n<div>\n<pre>[ root@curl-131556218-9fnch:\/ ]$ nslookup my-nginx\nServer:    10.0.0.10\nAddress 1: 10.0.0.10\nName:      my-nginx\nAddress 1: 10.0.162.149\n<\/pre>\n<\/div>\n<h2 id=\\\"service-\u5b89\u5168\\\">Service \u5b89\u5168<\/h2>\n<p>\u5230\u73b0\u5728\u4e3a\u6b62\uff0c\u6211\u4eec\u53ea\u5728\u96c6\u7fa4\u5185\u90e8\u8bbf\u95ee\u4e86 Nginx server\u3002\u5728\u5c06 Service \u66b4\u9732\u5230 Internet \u4e4b\u524d\uff0c\u6211\u4eec\u5e0c\u671b\u786e\u4fdd\u901a\u4fe1\u4fe1\u9053\u662f\u5b89\u5168\u7684\u3002\u5bf9\u4e8e\u8fd9\u53ef\u80fd\u9700\u8981\uff1a<\/p>\n<ul>\n<li>https \u81ea\u7b7e\u540d\u8bc1\u4e66\uff08\u9664\u975e\u5df2\u7ecf\u6709\u4e86\u4e00\u4e2a\u8bc6\u522b\u8eab\u4efd\u7684\u8bc1\u4e66\uff09<\/li>\n<li>\u4f7f\u7528\u8bc1\u4e66\u914d\u7f6e\u7684 Nginx server<\/li>\n<li>\u4f7f\u8bc1\u4e66\u53ef\u4ee5\u8bbf\u95ee Pod \u7684<a href=\\\"https:\/\/kubernetes.io\/docs\/user-guide\/secrets\\\">\u79d8\u94a5<\/a><\/li>\n<\/ul>\n<p>\u53ef\u4ee5\u4ece\u00a0<a href=\\\"https:\/\/github.com\/kubernetes\/kubernetes\/tree\/master\/examples\/https-nginx\/\\\">Nginx https \u793a\u4f8b<\/a>\u00a0\u83b7\u53d6\u6240\u6709\u4e0a\u8ff0\u5185\u5bb9\uff0c\u7b80\u660e\u793a\u4f8b\u5982\u4e0b\uff1a<\/p>\n<div>\n<pre>make keys KEY=\/tmp\/nginx.key CERT=\/tmp\/nginx.crt\nkubectl create secret tls nginxsecret --key \/tmp\/nginx.key --cert \/tmp\/nginx.crt\n<\/pre>\n<\/div>\n<pre>secret\/nginxsecret created\n<\/pre>\n<div>\n<pre>kubectl get secrets\n<\/pre>\n<\/div>\n<pre>NAME                  TYPE                                  DATA      AGE\ndefault-token-il9rc   kubernetes.io\/service-account-token   1         1d\nnginxsecret           Opaque                                2         1m\n<\/pre>\n<p>\u4ee5\u4e0b\u662f\u60a8\u5728\u8fd0\u884cmake\u65f6\u9047\u5230\u95ee\u9898\u65f6\u8981\u9075\u5faa\u7684\u624b\u52a8\u6b65\u9aa4\uff08\u4f8b\u5982\uff0c\u5728Windows\u4e0a\uff09\uff1a<\/p>\n<div>\n<pre>#create a public private key pair\nopenssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout \/d\/tmp\/nginx.key -out \/d\/tmp\/nginx.crt -subj \\\"\/CN=my-nginx\/O=my-nginx\\\"\n#convert the keys to base64 encoding\ncat \/d\/tmp\/nginx.crt | base64\ncat \/d\/tmp\/nginx.key | base64\n<\/pre>\n<\/div>\n<p>\u4f7f\u7528\u524d\u9762\u547d\u4ee4\u7684\u8f93\u51fa\u6765\u521b\u5efayaml\u6587\u4ef6\uff0c\u5982\u4e0b\u6240\u793a\u3002 base64\u7f16\u7801\u7684\u503c\u5e94\u5168\u90e8\u653e\u5728\u4e00\u884c\u4e0a\u3002<\/p>\n<div>\n<pre>apiVersion: \\\"v1\\\"\nkind: \\\"Secret\\\"\nmetadata:\n  name: \\\"nginxsecret\\\"\n  namespace: \\\"default\\\"\ndata:\n  nginx.crt: \\\"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURIekNDQWdlZ0F3SUJBZ0lKQUp5M3lQK0pzMlpJTUEwR0NTcUdTSWIzRFFFQkJRVUFNQ1l4RVRBUEJnTlYKQkFNVENHNW5hVzU0YzNaak1SRXdEd1lEVlFRS0V3aHVaMmx1ZUhOMll6QWVGdzB4TnpFd01qWXdOekEzTVRKYQpGdzB4T0RFd01qWXdOekEzTVRKYU1DWXhFVEFQQmdOVkJBTVRDRzVuYVc1NGMzWmpNUkV3RHdZRFZRUUtFd2h1CloybHVlSE4yWXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSjFxSU1SOVdWM0IKMlZIQlRMRmtobDRONXljMEJxYUhIQktMSnJMcy8vdzZhU3hRS29GbHlJSU94NGUrMlN5ajBFcndCLzlYTnBwbQppeW1CL3JkRldkOXg5UWhBQUxCZkVaTmNiV3NsTVFVcnhBZW50VWt1dk1vLzgvMHRpbGhjc3paenJEYVJ4NEo5Ci82UVRtVVI3a0ZTWUpOWTVQZkR3cGc3dlVvaDZmZ1Voam92VG42eHNVR0M2QURVODBpNXFlZWhNeVI1N2lmU2YKNHZpaXdIY3hnL3lZR1JBRS9mRTRqakxCdmdONjc2SU90S01rZXV3R0ljNDFhd05tNnNTSzRqYUNGeGpYSnZaZQp2by9kTlEybHhHWCtKT2l3SEhXbXNhdGp4WTRaNVk3R1ZoK0QrWnYvcW1mMFgvbVY0Rmo1NzV3ajFMWVBocWtsCmdhSXZYRyt4U1FVQ0F3RUFBYU5RTUU0d0hRWURWUjBPQkJZRUZPNG9OWkI3YXc1OUlsYkROMzhIYkduYnhFVjcKTUI4R0ExVWRJd1FZTUJhQUZPNG9OWkI3YXc1OUlsYkROMzhIYkduYnhFVjdNQXdHQTFVZEV3UUZNQU1CQWY4dwpEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRVhTMW9FU0lFaXdyMDhWcVA0K2NwTHI3TW5FMTducDBvMm14alFvCjRGb0RvRjdRZnZqeE04Tzd2TjB0clcxb2pGSW0vWDE4ZnZaL3k4ZzVaWG40Vm8zc3hKVmRBcStNZC9jTStzUGEKNmJjTkNUekZqeFpUV0UrKzE5NS9zb2dmOUZ3VDVDK3U2Q3B5N0M3MTZvUXRUakViV05VdEt4cXI0Nk1OZWNCMApwRFhWZmdWQTRadkR4NFo3S2RiZDY5eXM3OVFHYmg5ZW1PZ05NZFlsSUswSGt0ejF5WU4vbVpmK3FqTkJqbWZjCkNnMnlwbGQ0Wi8rUUNQZjl3SkoybFIrY2FnT0R4elBWcGxNSEcybzgvTHFDdnh6elZPUDUxeXdLZEtxaUMwSVEKQ0I5T2wwWW5scE9UNEh1b2hSUzBPOStlMm9KdFZsNUIyczRpbDlhZ3RTVXFxUlU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\\\"\n  nginx.key: \\\"LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ2RhaURFZlZsZHdkbFIKd1V5eFpJWmVEZWNuTkFhbWh4d1NpeWF5N1AvOE9ta3NVQ3FCWmNpQ0RzZUh2dGtzbzlCSzhBZi9WemFhWm9zcApnZjYzUlZuZmNmVUlRQUN3WHhHVFhHMXJKVEVGSzhRSHA3VkpMcnpLUC9QOUxZcFlYTE0yYzZ3MmtjZUNmZitrCkU1bEVlNUJVbUNUV09UM3c4S1lPNzFLSWVuNEZJWTZMMDUrc2JGQmd1Z0ExUE5JdWFubm9UTWtlZTRuMG4rTDQKb3NCM01ZUDhtQmtRQlAzeE9JNHl3YjREZXUraURyU2pKSHJzQmlIT05Xc0RadXJFaXVJMmdoY1kxeWIyWHI2UAozVFVOcGNSbC9pVG9zQngxcHJHclk4V09HZVdPeGxZZmcvbWIvNnBuOUYvNWxlQlkrZStjSTlTMkQ0YXBKWUdpCkwxeHZzVWtGQWdNQkFBRUNnZ0VBZFhCK0xkbk8ySElOTGo5bWRsb25IUGlHWWVzZ294RGQwci9hQ1Zkank4dlEKTjIwL3FQWkUxek1yall6Ry9kVGhTMmMwc0QxaTBXSjdwR1lGb0xtdXlWTjltY0FXUTM5SjM0VHZaU2FFSWZWNgo5TE1jUHhNTmFsNjRLMFRVbUFQZytGam9QSFlhUUxLOERLOUtnNXNrSE5pOWNzMlY5ckd6VWlVZWtBL0RBUlBTClI3L2ZjUFBacDRuRWVBZmI3WTk1R1llb1p5V21SU3VKdlNyblBESGtUdW1vVlVWdkxMRHRzaG9reUxiTWVtN3oKMmJzVmpwSW1GTHJqbGtmQXlpNHg0WjJrV3YyMFRrdWtsZU1jaVlMbjk4QWxiRi9DSmRLM3QraTRoMTVlR2ZQegpoTnh3bk9QdlVTaDR2Q0o3c2Q5TmtEUGJvS2JneVVHOXBYamZhRGR2UVFLQmdRRFFLM01nUkhkQ1pKNVFqZWFKClFGdXF4cHdnNzhZTjQyL1NwenlUYmtGcVFoQWtyczJxWGx1MDZBRzhrZzIzQkswaHkzaE9zSGgxcXRVK3NHZVAKOWRERHBsUWV0ODZsY2FlR3hoc0V0L1R6cEdtNGFKSm5oNzVVaTVGZk9QTDhPTm1FZ3MxMVRhUldhNzZxelRyMgphRlpjQ2pWV1g0YnRSTHVwSkgrMjZnY0FhUUtCZ1FEQmxVSUUzTnNVOFBBZEYvL25sQVB5VWs1T3lDdWc3dmVyClUycXlrdXFzYnBkSi9hODViT1JhM05IVmpVM25uRGpHVHBWaE9JeXg5TEFrc2RwZEFjVmxvcG9HODhXYk9lMTAKMUdqbnkySmdDK3JVWUZiRGtpUGx1K09IYnRnOXFYcGJMSHBzUVpsMGhucDBYSFNYVm9CMUliQndnMGEyOFVadApCbFBtWmc2d1BRS0JnRHVIUVV2SDZHYTNDVUsxNFdmOFhIcFFnMU16M2VvWTBPQm5iSDRvZUZKZmcraEppSXlnCm9RN3hqWldVR3BIc3AyblRtcHErQWlSNzdyRVhsdlhtOElVU2FsbkNiRGlKY01Pc29RdFBZNS9NczJMRm5LQTQKaENmL0pWb2FtZm1nZEN0ZGtFMXNINE9MR2lJVHdEbTRpb0dWZGIwMllnbzFyb2htNUpLMUI3MkpBb0dBUW01UQpHNDhXOTVhL0w1eSt5dCsyZ3YvUHM2VnBvMjZlTzRNQ3lJazJVem9ZWE9IYnNkODJkaC8xT2sybGdHZlI2K3VuCnc1YytZUXRSTHlhQmd3MUtpbGhFZDBKTWU3cGpUSVpnQWJ0LzVPbnlDak9OVXN2aDJjS2lrQ1Z2dTZsZlBjNkQKckliT2ZIaHhxV0RZK2Q1TGN1YSt2NzJ0RkxhenJsSlBsRzlOZHhrQ2dZRUF5elIzT3UyMDNRVVV6bUlCRkwzZAp4Wm5XZ0JLSEo3TnNxcGFWb2RjL0d5aGVycjFDZzE2MmJaSjJDV2RsZkI0VEdtUjZZdmxTZEFOOFRwUWhFbUtKCnFBLzVzdHdxNWd0WGVLOVJmMWxXK29xNThRNTBxMmk1NVdUTThoSDZhTjlaMTltZ0FGdE5VdGNqQUx2dFYxdEYKWSs4WFJkSHJaRnBIWll2NWkwVW1VbGc9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K\\\"\n<\/pre>\n<\/div>\n<p>\u73b0\u5728\u4f7f\u7528\u6587\u4ef6\u521b\u5efa secrets\uff1a<\/p>\n<div>\n<pre>kubectl apply -f nginxsecrets.yaml\nkubectl get secrets\n<\/pre>\n<\/div>\n<pre>NAME                  TYPE                                  DATA      AGE\ndefault-token-il9rc   kubernetes.io\/service-account-token   1         1d\nnginxsecret           Opaque                                2         1m\n<\/pre>\n<p>\u73b0\u5728\u4fee\u6539 Nginx \u526f\u672c\uff0c\u542f\u52a8\u4e00\u4e2a\u4f7f\u7528\u5728\u79d8\u94a5\u4e2d\u7684\u8bc1\u4e66\u7684 https \u670d\u52a1\u5668\u548c Servcie\uff0c\u90fd\u66b4\u9732\u7aef\u53e3\uff0880 \u548c 443\uff09\uff1a<\/p>\n<table id=\\\"service-networking-nginx-secure-app-yaml\\\">\n<thead>\n<tr>\n<th><a href=\\\"https:\/\/raw.githubusercontent.com\/kubernetes\/website\/master\/content\/zh\/examples\/service\/networking\/nginx-secure-app.yaml\\\" download=\\\"service\/networking\/nginx-secure-app.yaml\\\">service\/networking\/nginx-secure-app.yaml<\/a>\u00a0<img title=\\\"Copy service\/networking\/nginx-secure-app.yaml to clipboard\\\" src=\\\"https:\/\/d33wubrfki0l68.cloudfront.net\/951ae1fcc65e28202164b32c13fa7ae04fab4a0b\/b77dc\/images\/copycode.svg\\\" \/><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<div>\n<pre>apiVersion: v1\nkind: Service\nmetadata:\n  name: my-nginx\n  labels:\n    run: my-nginx\nspec:\n  type: NodePort\n  ports:\n  - port: 8080\n    targetPort: 80\n    protocol: TCP\n    name: http\n  - port: 443\n    protocol: TCP\n    name: https\n  selector:\n    run: my-nginx\n---\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: my-nginx\nspec:\n  selector:\n    matchLabels:\n      run: my-nginx\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        run: my-nginx\n    spec:\n      volumes:\n      - name: secret-volume\n        secret:\n          secretName: nginxsecret\n      - name: configmap-volume\n        configMap:\n          name: nginxconfigmap\n      containers:\n      - name: nginxhttps\n        image: bprashanth\/nginxhttps:1.0\n        ports:\n        - containerPort: 443\n        - containerPort: 80\n        volumeMounts:\n        - mountPath: \/etc\/nginx\/ssl\n          name: secret-volume\n        - mountPath: \/etc\/nginx\/conf.d\n          name: configmap-volume\n<\/pre>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5173\u4e8e nginx-secure-app manifest \u503c\u5f97\u6ce8\u610f\u7684\u70b9\u5982\u4e0b\uff1a<\/p>\n<ul>\n<li>\u5b83\u5728\u76f8\u540c\u7684\u6587\u4ef6\u4e2d\u5305\u542b\u4e86 Deployment \u548c Service \u7684\u89c4\u683c<\/li>\n<li><a href=\\\"https:\/\/github.com\/kubernetes\/kubernetes\/tree\/master\/examples\/https-nginx\/default.conf\\\">Nginx server<\/a>\u00a0\u5904\u7406 80 \u7aef\u53e3\u4e0a\u7684 http \u6d41\u91cf\uff0c\u4ee5\u53ca 443 \u7aef\u53e3\u4e0a\u7684 https \u6d41\u91cf\uff0cNginx Service \u66b4\u9732\u4e86\u8fd9\u4e24\u4e2a\u7aef\u53e3\u3002<\/li>\n<li>\u6bcf\u4e2a\u5bb9\u5668\u8bbf\u95ee\u6302\u8f7d\u5728 \/etc\/nginx\/ssl \u5377\u4e0a\u7684\u79d8\u94a5\u3002\u8fd9\u9700\u8981\u5728 Nginx server \u542f\u52a8\u4e4b\u524d\u5b89\u88c5\u597d\u3002<\/li>\n<\/ul>\n<div>\n<pre>kubectl delete deployments,svc my-nginx; kubectl create -f .\/nginx-secure-app.yaml\n<\/pre>\n<\/div>\n<p>\u8fd9\u65f6\u53ef\u4ee5\u4ece\u4efb\u4f55\u8282\u70b9\u8bbf\u95ee\u5230 Nginx server\u3002<\/p>\n<div>\n<pre>kubectl get pods -o yaml | grep -i podip\n    podIP: 10.244.3.5\nnode $ curl -k https:\/\/10.244.3.5\n...\n&lt;h1&gt;Welcome to nginx!&lt;\/h1&gt;\n<\/pre>\n<\/div>\n<p>\u6ce8\u610f\u6700\u540e\u4e00\u6b65\u6211\u4eec\u662f\u5982\u4f55\u63d0\u4f9b\u00a0-k\u00a0\u53c2\u6570\u6267\u884c curl\u547d\u4ee4\u7684\uff0c\u8fd9\u662f\u56e0\u4e3a\u5728\u8bc1\u4e66\u751f\u6210\u65f6\uff0c\u6211\u4eec\u4e0d\u77e5\u9053\u4efb\u4f55\u5173\u4e8e\u8fd0\u884c Nginx \u7684 Pod \u7684\u4fe1\u606f\uff0c\u6240\u4ee5\u4e0d\u5f97\u4e0d\u5728\u6267\u884c curl \u547d\u4ee4\u65f6\u5ffd\u7565 CName \u4e0d\u5339\u914d\u7684\u60c5\u51b5\u3002 \u901a\u8fc7\u521b\u5efa Service\uff0c\u6211\u4eec\u8fde\u63a5\u4e86\u5728\u8bc1\u4e66\u4e2d\u7684 CName \u4e0e\u5728 Service \u67e5\u8be2\u65f6\u88ab Pod\u4f7f\u7528\u7684\u5b9e\u9645 DNS \u540d\u5b57\u3002 \u8ba9\u6211\u4eec\u4ece\u4e00\u4e2a Pod \u6765\u6d4b\u8bd5\uff08\u4e3a\u4e86\u7b80\u5316\u4f7f\u7528\u540c\u4e00\u4e2a\u79d8\u94a5\uff0cPod \u4ec5\u9700\u8981\u4f7f\u7528 nginx.crt \u53bb\u8bbf\u95ee Service\uff09\uff1a<\/p>\n<table id=\\\"service-networking-curlpod-yaml\\\">\n<thead>\n<tr>\n<th><a href=\\\"https:\/\/raw.githubusercontent.com\/kubernetes\/website\/master\/content\/zh\/examples\/service\/networking\/curlpod.yaml\\\" download=\\\"service\/networking\/curlpod.yaml\\\">service\/networking\/curlpod.yaml<\/a>\u00a0<img title=\\\"Copy service\/networking\/curlpod.yaml to clipboard\\\" src=\\\"https:\/\/d33wubrfki0l68.cloudfront.net\/951ae1fcc65e28202164b32c13fa7ae04fab4a0b\/b77dc\/images\/copycode.svg\\\" \/><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\n<div>\n<pre>apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: curl-deployment\nspec:\n  selector:\n    matchLabels:\n      app: curlpod\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: curlpod\n    spec:\n      volumes:\n      - name: secret-volume\n        secret:\n          secretName: nginxsecret\n      containers:\n      - name: curlpod\n        command:\n        - sh\n        - -c\n        - while true; do sleep 1; done\n        image: radial\/busyboxplus:curl\n        volumeMounts:\n        - mountPath: \/etc\/nginx\/ssl\n          name: secret-volume\n<\/pre>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div>\n<pre>kubectl apply -f .\/curlpod.yaml\nkubectl get pods -l app=curlpod\n<\/pre>\n<\/div>\n<pre>NAME                               READY     STATUS    RESTARTS   AGE\ncurl-deployment-1515033274-1410r   1\/1       Running   0          1m\n<\/pre>\n<div>\n<pre>kubectl exec curl-deployment-1515033274-1410r -- curl https:\/\/my-nginx --cacert \/etc\/nginx\/ssl\/nginx.crt\n...\n&lt;title&gt;Welcome to nginx!&lt;\/title&gt;\n...\n<\/pre>\n<\/div>\n<h2 id=\\\"\u66b4\u9732-service\\\">\u66b4\u9732 Service<\/h2>\n<p>\u5bf9\u6211\u4eec\u5e94\u7528\u7684\u67d0\u4e9b\u90e8\u5206\uff0c\u53ef\u80fd\u5e0c\u671b\u5c06 Service \u66b4\u9732\u5728\u4e00\u4e2a\u5916\u90e8 IP \u5730\u5740\u4e0a\u3002 Kubernetes \u652f\u6301\u4e24\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff1aNodePort \u548c LoadBalancer\u3002 \u5728\u4e0a\u4e00\u6bb5\u521b\u5efa\u7684 Service \u4f7f\u7528\u4e86\u00a0NodePort\uff0c\u56e0\u6b64 Nginx https \u526f\u672c\u5df2\u7ecf\u5c31\u7eea\uff0c\u5982\u679c\u4f7f\u7528\u4e00\u4e2a\u516c\u7f51 IP\uff0c\u80fd\u591f\u5904\u7406 Internet \u4e0a\u7684\u6d41\u91cf\u3002<\/p>\n<div>\n<pre>kubectl get svc my-nginx -o yaml | grep nodePort -C 5\n  uid: 07191fb3-f61a-11e5-8ae5-42010af00002\nspec:\n  clusterIP: 10.0.162.149\n  ports:\n  - name: http\n    nodePort: 31704\n    port: 8080\n    protocol: TCP\n    targetPort: 80\n  - name: https\n    nodePort: 32453\n    port: 443\n    protocol: TCP\n    targetPort: 443\n  selector:\n    run: my-nginx\n<\/pre>\n<\/div>\n<div>\n<pre>kubectl get nodes -o yaml | grep ExternalIP -C 1\n    - address: 104.197.41.11\n      type: ExternalIP\n    allocatable:\n--\n    - address: 23.251.152.56\n      type: ExternalIP\n    allocatable:\n...\n$ curl https:\/\/&lt;EXTERNAL-IP&gt;:&lt;NODE-PORT&gt; -k\n...\n&lt;h1&gt;Welcome to nginx!&lt;\/h1&gt;\n<\/pre>\n<\/div>\n<p>\u8ba9\u6211\u4eec\u91cd\u65b0\u521b\u5efa\u4e00\u4e2a Service\uff0c\u4f7f\u7528\u4e00\u4e2a\u4e91\u8d1f\u8f7d\u5747\u8861\u5668\uff0c\u53ea\u9700\u8981\u5c06\u00a0my-nginx\u00a0Service \u7684\u00a0Type\u00a0\u7531\u00a0NodePort\u00a0\u6539\u6210\u00a0LoadBalancer\u3002<\/p>\n<div>\n<pre>kubectl edit svc my-nginx\nkubectl get svc my-nginx\n<\/pre>\n<\/div>\n<pre>NAME       TYPE        CLUSTER-IP     EXTERNAL-IP        PORT(S)               AGE\nmy-nginx   ClusterIP   10.0.162.149   162.222.184.144    80\/TCP,81\/TCP,82\/TCP  21s\n<\/pre>\n<pre>curl https:\/\/&lt;EXTERNAL-IP&gt; -k\n...\n&lt;title&gt;Welcome to nginx!&lt;\/title&gt;\n<\/pre>\n<p>\u5728\u00a0EXTERNAL-IP\u00a0\u5217\u6307\u5b9a\u7684 IP \u5730\u5740\u662f\u5728\u516c\u7f51\u4e0a\u53ef\u7528\u7684\u3002CLUSTER-IP\u00a0\u53ea\u5728\u96c6\u7fa4\/\u79c1\u6709\u4e91\u7f51\u7edc\u4e2d\u53ef\u7528\u3002<br \/>\n\u6ce8\u610f\uff0c\u5728 AWS \u4e0a\u7c7b\u578b\u00a0LoadBalancer\u00a0\u521b\u5efa\u4e00\u4e2a ELB\uff0c\u5b83\u4f7f\u7528\u4e3b\u673a\u540d\uff08\u6bd4\u8f83\u957f\uff09\uff0c\u800c\u4e0d\u662f IP\u3002 \u5b83\u592a\u957f\u4ee5\u81f3\u4e8e\u4e0d\u80fd\u9002\u914d\u6807\u51c6\u00a0kubectl get svc\u00a0\u7684\u8f93\u51fa\uff0c\u4e8b\u5b9e\u4e0a\u9700\u8981\u901a\u8fc7\u6267\u884c\u00a0kubectl describe service my-nginx\u00a0\u547d\u4ee4\u6765\u67e5\u770b\u5b83\u3002 \u53ef\u4ee5\u770b\u5230\u7c7b\u4f3c\u5982\u4e0b\u5185\u5bb9\uff1a<\/p>\n<div>\n<pre>kubectl describe service my-nginx\n...\nLoadBalancer Ingress:   a320587ffd19711e5a37606cf4a74574-1142138393.us-east-1.elb.amazonaws.com\n...<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Kubernetes \u8fde\u63a5\u5bb9\u5668\u6a21\u578b \u65e2\u7136\u6709\u4e86\u4e00\u4e2a\u6301\u7eed\u8fd0\u884c\u3001\u53ef\u590d\u5236\u7684\u5e94\u7528\uff0c\u6211\u4eec\u5c31\u80fd\u591f\u5c06\u5b83\u66b4\u9732\u5230\u7f51\u7edc\u4e0a\u3002 \u5728\u8ba8\u8bba  &hellip;<\/p>\n<p class=\"read-more\"> <a class=\"\" href=\"http:\/\/www.weijing.co\/?p=1648\"> <span class=\"screen-reader-text\">Kubernetes\u5e94\u7528\u8fde\u63a5\u5230 Service<\/span> \u67e5\u770b\u5168\u6587 &raquo;<\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"default","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":""},"categories":[104,123],"tags":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"mailpoet_newsletter_max":false,"woocommerce_thumbnail":false,"woocommerce_single":false,"woocommerce_gallery_thumbnail":false,"shop_catalog":false,"shop_single":false,"shop_thumbnail":false},"uagb_author_info":{"display_name":"weijing","author_link":"http:\/\/www.weijing.co\/?author=4"},"uagb_comment_info":0,"uagb_excerpt":"Kubernetes \u8fde\u63a5\u5bb9\u5668\u6a21\u578b \u65e2\u7136\u6709\u4e86\u4e00\u4e2a\u6301\u7eed\u8fd0\u884c\u3001\u53ef\u590d\u5236\u7684\u5e94\u7528\uff0c\u6211\u4eec\u5c31\u80fd\u591f\u5c06\u5b83\u66b4\u9732\u5230\u7f51\u7edc\u4e0a\u3002 \u5728\u8ba8\u8bba &hellip;","_links":{"self":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/posts\/1648"}],"collection":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1648"}],"version-history":[{"count":0,"href":"http:\/\/www.weijing.co\/index.php?rest_route=\/wp\/v2\/posts\/1648\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1648"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1648"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.weijing.co\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1648"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}