From 7f5c356a5d341b56e441d9929790894b3e393b09 Mon Sep 17 00:00:00 2001
From: Jimmy Song
Date: Tue, 21 Nov 2017 20:10:10 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=E5=A4=96=E9=83=A8=E8=AE=BF=E9=97=AEKu?=
=?UTF-8?q?bernetes=E4=B8=AD=E7=9A=84Pod?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
appendix/debug-kubernetes-services.html | 23 +-
appendix/docker-best-practice.html | 23 +-
appendix/index.html | 23 +-
appendix/issues.html | 23 +-
appendix/material-share.html | 26 +-
appendix/tricks.html | 39 +-
...ernetes-and-cloud-native-app-overview.html | 23 +-
concepts/annotation.html | 23 +-
concepts/concepts.html | 23 +-
concepts/configmap-hot-update.html | 23 +-
concepts/configmap.html | 23 +-
concepts/cronjob.html | 23 +-
concepts/daemonset.html | 23 +-
concepts/deployment.html | 23 +-
concepts/garbage-collection.html | 23 +-
concepts/horizontal-pod-autoscaling.html | 23 +-
concepts/index.html | 23 +-
concepts/ingress.html | 23 +-
concepts/init-containers.html | 23 +-
concepts/job.html | 23 +-
concepts/label.html | 23 +-
concepts/namespace.html | 23 +-
concepts/network-policy.html | 23 +-
concepts/node.html | 23 +-
concepts/objects.html | 23 +-
concepts/pod-lifecycle.html | 23 +-
concepts/pod-overview.html | 23 +-
concepts/pod-security-policy.html | 23 +-
concepts/pod.html | 27 +-
concepts/replicaset.html | 23 +-
concepts/secret.html | 23 +-
concepts/service.html | 23 +-
concepts/serviceaccount.html | 23 +-
concepts/statefulset.html | 23 +-
concepts/volume.html | 23 +-
develop/client-go-sample.html | 23 +-
develop/contribute.html | 23 +-
develop/developing-environment.html | 23 +-
develop/index.html | 23 +-
develop/minikube.html | 23 +-
develop/testing.html | 23 +-
guide/access-cluster.html | 27 +-
guide/access-kubernetes-cluster.html | 27 +-
...etes-pods-from-outside-of-the-cluster.html | 2587 +++++++++++++++++
...plication-development-deployment-flow.html | 27 +-
guide/auth-with-kubeconfig-or-token.html | 23 +-
...thenticate-across-clusters-kubeconfig.html | 27 +-
guide/authentication.html | 25 +-
guide/cluster-security-management.html | 23 +-
guide/command-usage.html | 23 +-
.../configure-liveness-readiness-probes.html | 23 +-
guide/configure-pod-service-account.html | 23 +-
...nnecting-to-applications-port-forward.html | 27 +-
guide/deploy-applications-in-kubernetes.html | 23 +-
guide/docker-cli-to-kubectl.html | 23 +-
guide/index.html | 23 +-
guide/ip-masq-agent.html | 23 +-
guide/kubectl-cheatsheet.html | 23 +-
...ctl-user-authentication-authorization.html | 23 +-
.../kubelet-authentication-authorization.html | 23 +-
guide/managing-tls-in-a-cluster.html | 23 +-
.../migrating-hadoop-yarn-to-kubernetes.html | 23 +-
guide/rbac.html | 23 +-
guide/resource-configuration.html | 23 +-
guide/resource-quota-management.html | 23 +-
guide/secret-configuration.html | 23 +-
guide/service-access-application-cluster.html | 31 +-
guide/tls-bootstrapping.html | 23 +-
guide/using-kubectl.html | 23 +-
guide/using-statefulset.html | 23 +-
images/redpoint-faas-landscape.jpg | Bin 0 -> 181238 bytes
index.html | 23 +-
practice/app-log-collection.html | 23 +-
practice/cephfs.html | 23 +-
practice/ci-cd.html | 23 +-
practice/configuration-best-practice.html | 23 +-
practice/create-kubeconfig.html | 23 +-
practice/create-private-charts-repo.html | 23 +-
practice/create-tls-and-secret-key.html | 23 +-
practice/dashboard-addon-installation.html | 23 +-
practice/dashboard-upgrade.html | 23 +-
practice/data-persistence-problem.html | 23 +-
practice/distributed-load-test.html | 23 +-
practice/drone-ci-cd.html | 23 +-
practice/edge-node-configuration.html | 23 +-
practice/efk-addon-installation.html | 23 +-
practice/etcd-cluster-installation.html | 23 +-
practice/glusterfs.html | 23 +-
practice/heapster-addon-installation.html | 23 +-
practice/heapster.html | 23 +-
practice/helm.html | 23 +-
practice/index.html | 23 +-
practice/install-kbernetes1.6-on-centos.html | 23 +-
practice/jenkins-ci-cd.html | 23 +-
practice/kubectl-installation.html | 23 +-
practice/kubedns-addon-installation.html | 23 +-
.../manage-compute-resources-container.html | 23 +-
practice/manually-upgrade.html | 23 +-
practice/master-installation.html | 23 +-
practice/monitor.html | 23 +-
practice/monitoring.html | 23 +-
.../network-and-cluster-perfermance-test.html | 23 +-
practice/nginx-ingress-installation.html | 23 +-
practice/node-installation.html | 23 +-
practice/operation.html | 23 +-
practice/prometheus.html | 23 +-
.../service-discovery-and-loadbalancing.html | 23 +-
practice/service-rolling-update.html | 23 +-
practice/services-management-tool.html | 23 +-
...ainers-using-glusterfs-with-openshift.html | 23 +-
practice/storage.html | 23 +-
practice/traefik-ingress-installation.html | 23 +-
practice/update-and-upgrade.html | 23 +-
.../using-ceph-for-persistent-storage.html | 23 +-
...sing-glusterfs-for-persistent-storage.html | 23 +-
.../using-heapster-to-get-object-metrics.html | 23 +-
...metheus-to-monitor-kuberentes-cluster.html | 23 +-
search_plus_index.json | 2 +-
usecases/big-data.html | 23 +-
usecases/configuring-request-routing.html | 23 +-
usecases/edge-computing.html | 23 +-
usecases/index.html | 23 +-
usecases/install-and-expand-istio-mesh.html | 23 +-
usecases/integrating-vms.html | 23 +-
usecases/istio-installation.html | 23 +-
usecases/istio.html | 23 +-
usecases/linkerd-user-guide.html | 23 +-
usecases/linkerd.html | 23 +-
usecases/microservices.html | 23 +-
...park-with-kubernetes-native-scheduler.html | 23 +-
usecases/serverless.html | 35 +-
.../service-discovery-in-microservices.html | 23 +-
usecases/service-mesh.html | 23 +-
usecases/spark-standalone-on-kubernetes.html | 23 +-
134 files changed, 5120 insertions(+), 547 deletions(-)
create mode 100644 guide/accessing-kubernetes-pods-from-outside-of-the-cluster.html
create mode 100644 images/redpoint-faas-landscape.jpg
diff --git a/appendix/debug-kubernetes-services.html b/appendix/debug-kubernetes-services.html
index 932ac91d6..aa4878783 100644
--- a/appendix/debug-kubernetes-services.html
+++ b/appendix/debug-kubernetes-services.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2422,7 +2437,7 @@ kubectl top pod POD_NAME --containers
diff --git a/appendix/docker-best-practice.html b/appendix/docker-best-practice.html
index 1361317d9..f10cf15eb 100644
--- a/appendix/docker-best-practice.html
+++ b/appendix/docker-best-practice.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2470,7 +2485,7 @@
diff --git a/appendix/index.html b/appendix/index.html
index aab6e06b5..fa1418153 100644
--- a/appendix/index.html
+++ b/appendix/index.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2399,7 +2414,7 @@
diff --git a/appendix/issues.html b/appendix/issues.html
index e420b0a3e..80318fad4 100644
--- a/appendix/issues.html
+++ b/appendix/issues.html
@@ -932,7 +932,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -963,7 +963,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -993,7 +993,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2455,7 +2470,7 @@ kubectl patch deploy --namespace kube-system tiller-deploy -p
diff --git a/appendix/material-share.html b/appendix/material-share.html
index 50dbd8e01..e210e3dfb 100644
--- a/appendix/material-share.html
+++ b/appendix/material-share.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2359,6 +2374,7 @@
arun-gupta/kubernetes-java-sample
feiskyer/kubernetes-handbook
kelseyhightower/kubernetes-the-hard-way
+ks - A series of Kubernetes walk-throughs
opsnull/follow-me-install-kubernetes-cluster
rootsongjc/kubernetes-handbook
@@ -2416,7 +2432,7 @@
wercker
@@ -2460,7 +2476,7 @@
diff --git a/appendix/tricks.html b/appendix/tricks.html
index cc088d3f5..e25539c59 100644
--- a/appendix/tricks.html
+++ b/appendix/tricks.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2501,8 +2516,22 @@
fieldPath: spec.serviceAccountName
restartPolicy: Never
+7. 配置Pod使用外部DNS
+修改kube-dns的使用的ConfigMap。
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: kube-dns
+ namespace: kube-system
+data:
+ stubDomains: |
+ {"k8s.com": ["192.168.10.10"]}
+ upstreamNameservers: |
+ ["8.8.8.8", "8.8.4.4"]
+
+upstreamNameservers
即使用的外部DNS,参考:Configuring Private DNS Zones and Upstream Nameservers in Kubernetes
@@ -2546,7 +2575,7 @@
diff --git a/cloud-native/kubernetes-and-cloud-native-app-overview.html b/cloud-native/kubernetes-and-cloud-native-app-overview.html
index 4f3cc7313..1124c068b 100644
--- a/cloud-native/kubernetes-and-cloud-native-app-overview.html
+++ b/cloud-native/kubernetes-and-cloud-native-app-overview.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2742,7 +2757,7 @@
diff --git a/concepts/annotation.html b/concepts/annotation.html
index 7e43c7a94..1034747ad 100644
--- a/concepts/annotation.html
+++ b/concepts/annotation.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2455,7 +2470,7 @@
diff --git a/concepts/concepts.html b/concepts/concepts.html
index 123aa2407..9513a75c5 100644
--- a/concepts/concepts.html
+++ b/concepts/concepts.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2472,7 +2487,7 @@
diff --git a/concepts/configmap-hot-update.html b/concepts/configmap-hot-update.html
index a231b14af..d90960b90 100644
--- a/concepts/configmap-hot-update.html
+++ b/concepts/configmap-hot-update.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2751,7 +2766,7 @@ DEBUG
diff --git a/concepts/configmap.html b/concepts/configmap.html
index 6fdb96ff3..e81343c8d 100644
--- a/concepts/configmap.html
+++ b/concepts/configmap.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2677,7 +2692,7 @@ log_level=INFO
diff --git a/concepts/cronjob.html b/concepts/cronjob.html
index 98aa0db10..31d09ee04 100644
--- a/concepts/cronjob.html
+++ b/concepts/cronjob.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2484,7 +2499,7 @@ job "hello-1202039034" deleted
diff --git a/concepts/daemonset.html b/concepts/daemonset.html
index 283dc5a5b..fff914f21 100644
--- a/concepts/daemonset.html
+++ b/concepts/daemonset.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2463,7 +2478,7 @@
diff --git a/concepts/deployment.html b/concepts/deployment.html
index db9bf9df3..7c14d9abc 100644
--- a/concepts/deployment.html
+++ b/concepts/deployment.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2935,7 +2950,7 @@ $ echo $?
diff --git a/concepts/garbage-collection.html b/concepts/garbage-collection.html
index 5f3777f8b..05c0c67f3 100644
--- a/concepts/garbage-collection.html
+++ b/concepts/garbage-collection.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2480,7 +2495,7 @@ curl -X DELETE localhost:8080/apis/extensions/v1beta1/namespaces/default/replica
diff --git a/concepts/horizontal-pod-autoscaling.html b/concepts/horizontal-pod-autoscaling.html
index 4c8e91055..4d5981b0d 100644
--- a/concepts/horizontal-pod-autoscaling.html
+++ b/concepts/horizontal-pod-autoscaling.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2493,7 +2508,7 @@ kubectl delete hpa
diff --git a/concepts/index.html b/concepts/index.html
index c9e1c035c..2b4d8ce14 100644
--- a/concepts/index.html
+++ b/concepts/index.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2456,7 +2471,7 @@ Kubernetes 还提供完善的管理]
diff --git a/concepts/ingress.html b/concepts/ingress.html
index 2d6c34f34..0448161fa 100644
--- a/concepts/ingress.html
+++ b/concepts/ingress.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2612,7 +2627,7 @@ NAME RULE BACKEND ADDRESS
diff --git a/concepts/init-containers.html b/concepts/init-containers.html
index e2633990d..b9ffe71c0 100644
--- a/concepts/init-containers.html
+++ b/concepts/init-containers.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2586,7 +2601,7 @@ myapp-pod 1/1 Running 0 9m
diff --git a/concepts/job.html b/concepts/job.html
index 7c0dd674a..20582cffd 100644
--- a/concepts/job.html
+++ b/concepts/job.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2424,7 +2439,7 @@ $ kubectl logs $pods
diff --git a/concepts/label.html b/concepts/label.html
index 8da919ad9..d4571257c 100644
--- a/concepts/label.html
+++ b/concepts/label.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2469,7 +2484,7 @@ $ kubectl get pods -l &apo
diff --git a/concepts/namespace.html b/concepts/namespace.html
index 8fef932ac..387808e08 100644
--- a/concepts/namespace.html
+++ b/concepts/namespace.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2400,7 +2415,7 @@
diff --git a/concepts/network-policy.html b/concepts/network-policy.html
index 3c5f44358..bff17bcd4 100644
--- a/concepts/network-policy.html
+++ b/concepts/network-policy.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2453,7 +2468,7 @@
diff --git a/concepts/node.html b/concepts/node.html
index f19546a64..4bfeb4cde 100644
--- a/concepts/node.html
+++ b/concepts/node.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2423,7 +2438,7 @@
diff --git a/concepts/objects.html b/concepts/objects.html
index 89db2276c..48720a43a 100644
--- a/concepts/objects.html
+++ b/concepts/objects.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2490,7 +2505,7 @@
diff --git a/concepts/pod-lifecycle.html b/concepts/pod-lifecycle.html
index b7a7f746c..b2f3d854a 100644
--- a/concepts/pod-lifecycle.html
+++ b/concepts/pod-lifecycle.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2545,7 +2560,7 @@
diff --git a/concepts/pod-overview.html b/concepts/pod-overview.html
index a1d347593..2161c7805 100644
--- a/concepts/pod-overview.html
+++ b/concepts/pod-overview.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2435,7 +2450,7 @@
diff --git a/concepts/pod-security-policy.html b/concepts/pod-security-policy.html
index e2a067b67..a2ccebd9e 100644
--- a/concepts/pod-security-policy.html
+++ b/concepts/pod-security-policy.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2596,7 +2611,7 @@ podsecuritypolicy "permissive" delete
diff --git a/concepts/pod.html b/concepts/pod.html
index d7029f46f..ec92cfd3c 100644
--- a/concepts/pod.html
+++ b/concepts/pod.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2354,7 +2369,7 @@
Pod中的容器共享IP地址和端口号,它们之间可以通过localhost
互相发现。它们之间可以通过进程间通信,例如SystemV信号或者POSIX共享内存。不同Pod之间的容器具有不同的IP地址,不能直接通过IPC通信。
Pod中的容器也有访问共享volume的权限,这些volume会被定义成pod的一部分并挂载到应用容器的文件系统中。
根据docker的结构,Pod中的容器共享namespace和volume,不支持共享PID的namespace。
-就像每个应用容器,pod被认为是临时(非持久的)实体。在Pod的生命周期中讨论过,pod被创建后,被分配一个唯一的UI(UID),调度到节点上,并一致维持期望的状态知道被终结(根据重启策略)或者被删除。如果node死掉了,分配到了这个node上的pod,在经过一个超时时间后会被重新调度到其他node节点上。一个给定的pod(如UID定义的)不会被“重新调度”到新的节点上,而是被一个同样的pod取代,如果期望的话甚至可以是相同的名字,但是会有一个新的UID(查看replication controller获取详情)。(未来,一个更高级别的API将支持pod迁移)。
+就像每个应用容器,pod被认为是临时(非持久的)实体。在Pod的生命周期中讨论过,pod被创建后,被分配一个唯一的UI(UID),调度到节点上,并一致维持期望的状态直到被终结(根据重启策略)或者被删除。如果node死掉了,分配到了这个node上的pod,在经过一个超时时间后会被重新调度到其他node节点上。一个给定的pod(如UID定义的)不会被“重新调度”到新的节点上,而是被一个同样的pod取代,如果期望的话甚至可以是相同的名字,但是会有一个新的UID(查看replication controller获取详情)。(未来,一个更高级别的API将支持pod迁移)。
Volume跟pod有相同的生命周期(当其UID存在的时候)。当Pod因为某种原因被删除或者被新创建的相同的Pod取代,它相关的东西(例如volume)也会被销毁和再创建一个新的volume。
A multi-container pod that contains a file puller and a web server that uses a persistent volume for shared storage between the containers.
@@ -2432,7 +2447,7 @@
在kuberentes1.6的V1 core API版本中的Pod的数据结构如下图所示:
@@ -2476,7 +2491,7 @@
diff --git a/concepts/replicaset.html b/concepts/replicaset.html
index b98ebe786..99778640b 100644
--- a/concepts/replicaset.html
+++ b/concepts/replicaset.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2440,7 +2455,7 @@
diff --git a/concepts/secret.html b/concepts/secret.html
index a2d70b2ce..657630627 100644
--- a/concepts/secret.html
+++ b/concepts/secret.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2518,7 +2533,7 @@ token
diff --git a/concepts/service.html b/concepts/service.html
index e274e6fc9..1a4496e9d 100644
--- a/concepts/service.html
+++ b/concepts/service.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2723,7 +2738,7 @@ iptables 代理不会隐藏 Kubernetes 集
diff --git a/concepts/serviceaccount.html b/concepts/serviceaccount.html
index 9f006b122..3a1c4783a 100644
--- a/concepts/serviceaccount.html
+++ b/concepts/serviceaccount.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2539,7 +2554,7 @@ serviceaccounts/default
diff --git a/concepts/statefulset.html b/concepts/statefulset.html
index 8d59e189a..01aecc547 100644
--- a/concepts/statefulset.html
+++ b/concepts/statefulset.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2858,7 +2873,7 @@ zk-0 10.254.98.14 <nodes> 2181:31693/TCP 5m
diff --git a/concepts/volume.html b/concepts/volume.html
index 6a8365779..26f419c3b 100644
--- a/concepts/volume.html
+++ b/concepts/volume.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2545,7 +2560,7 @@
diff --git a/develop/client-go-sample.html b/develop/client-go-sample.html
index adce65693..5de777ffb 100644
--- a/develop/client-go-sample.html
+++ b/develop/client-go-sample.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2630,7 +2645,7 @@ Events:
diff --git a/develop/contribute.html b/develop/contribute.html
index cf59a8179..783c460d8 100644
--- a/develop/contribute.html
+++ b/develop/contribute.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2398,7 +2413,7 @@
diff --git a/develop/developing-environment.html b/develop/developing-environment.html
index 710c8ff82..edffdaa37 100644
--- a/develop/developing-environment.html
+++ b/develop/developing-environment.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2411,7 +2426,7 @@
diff --git a/develop/index.html b/develop/index.html
index 532266e29..80dce049f 100644
--- a/develop/index.html
+++ b/develop/index.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2391,7 +2406,7 @@
diff --git a/develop/minikube.html b/develop/minikube.html
index f9a944d36..19686ef49 100644
--- a/develop/minikube.html
+++ b/develop/minikube.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2428,7 +2443,7 @@ Kubectl is now configured to use the cluster.
diff --git a/develop/testing.html b/develop/testing.html
index 8afee22d3..dc67612f2 100644
--- a/develop/testing.html
+++ b/develop/testing.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2505,7 +2520,7 @@ make test_e2e_node TEST_ARGS=
diff --git a/guide/access-cluster.html b/guide/access-cluster.html
index a7be38f7d..067dc09ef 100644
--- a/guide/access-cluster.html
+++ b/guide/access-cluster.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2585,12 +2600,12 @@ $ curl $APISERVER/api --header
+
-
+
@@ -2601,7 +2616,7 @@ $ curl $APISERVER/api --header
diff --git a/guide/access-kubernetes-cluster.html b/guide/access-kubernetes-cluster.html
index 391aaef28..8a98dfb9e 100644
--- a/guide/access-kubernetes-cluster.html
+++ b/guide/access-kubernetes-cluster.html
@@ -4,7 +4,7 @@
- 访问 Kubernetes 集群 · Kubernetes Handbook - jimmysong.io
+ 访问Kubernetes集群 · Kubernetes Handbook - jimmysong.io
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2329,7 +2344,7 @@
@@ -2397,7 +2412,7 @@
diff --git a/guide/accessing-kubernetes-pods-from-outside-of-the-cluster.html b/guide/accessing-kubernetes-pods-from-outside-of-the-cluster.html
new file mode 100644
index 000000000..14262ed18
--- /dev/null
+++ b/guide/accessing-kubernetes-pods-from-outside-of-the-cluster.html
@@ -0,0 +1,2587 @@
+
+
+
+
+
+
+ 从外部访问Kubernetes中的Pod · Kubernetes Handbook - jimmysong.io
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 从外部访问Kubernetes中的Pod
+前面几节讲到如何访问kubneretes集群,本文主要讲解访问kubenretes中的Pod和Serivce的集中方式,包括如下几种:
+
+- hostNetwork
+- hostPort
+- NodePort
+- LoadBalancer
+- Ingress
+
+说是暴露Pod其实跟暴露Service是一回事,因为Pod就是Service的backend。
+hostNetwork: true
+这是一种直接定义Pod网络的方式。
+如果在Pod中使用hostNotwork:true
配置的话,在这种pod中运行的应用程序可以直接看到pod启动的主机的网络接口。在主机的所有网络接口上都可以访问到该应用程序。以下是使用主机网络的pod的示例定义:
+apiVersion: v1
+kind: Pod
+metadata:
+ name: influxdb
+spec:
+ hostNetwork: true
+ containers:
+ - name: influxdb
+ image: influxdb
+
+部署该Pod:
+$ kubectl create -f influxdb-hostnetwork.yml
+
+访问该pod所在主机的8086端口:
+curl -v http://$POD_IP:8086/ping
+
+将看到204 No Content的204返回码,说明可以正常访问。
+注意每次启动这个Pod的时候都可能被调度到不同的节点上,所有外部访问Pod的IP也是变化的,而且调度Pod的时候还需要考虑是否与宿主机上的端口冲突,因此一般情况下除非您知道需要某个特定应用占用特定宿主机上的特定端口时才使用hostNetwork: true
的方式。
+这种Pod的网络模式有一个用处就是可以将网络插件包装在Pod中然后部署在每个宿主机上,这样该Pod就可以控制该宿主机上的所有网络。
+hostPort
+这是一种直接定义Pod网络的方式。
+hostPort
是直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了,如:。
+apiVersion: v1
+kind: Pod
+metadata:
+ name: influxdb
+spec:
+ containers:
+ - name: influxdb
+ image: influxdb
+ ports:
+ - containerPort: 8086
+ hostPort: 8086
+
+这样做有个缺点,因为Pod重新调度的时候该Pod被调度到的宿主机可能会变动,这样就变化了,用户必须自己维护一个Pod与所在宿主机的对应关系。
+这种网络方式可以用来做 nginx Ingress controller。外部流量都需要通过kubenretes node节点的80和443端口。
+NodePort
+NodePort在kubenretes里是一个广泛应用的服务暴露方式。Kubernetes中的service默认情况下都是使用的ClusterIP
这种类型,这样的service会产生一个ClusterIP,这个IP只能在集群内部访问,要想让外部能够直接访问service,需要将service type修改为 nodePort
。
+apiVersion: v1
+kind: Pod
+metadata:
+ name: influxdb
+ labels:
+ name: influxdb
+spec:
+ containers:
+ - name: influxdb
+ image: influxdb
+ ports:
+ - containerPort: 8086
+
+同时还可以给service指定一个nodePort
值,范围是30000-32767,这个值在API server的配置文件中,用--service-node-port-range
定义。
+kind: Service
+apiVersion: v1
+metadata:
+ name: influxdb
+spec:
+ type: NodePort
+ ports:
+ - port: 8086
+ nodePort: 30000
+ selector:
+ name: influxdb
+
+集群外就可以使用kubernetes任意一个节点的IP加上30000端口访问该服务了。kube-proxy会自动将流量以round-robin的方式转发给该service的每一个pod。
+这种服务暴露方式,无法让你指定自己想要的应用常用端口,不过可以在集群上再部署一个反向代理作为流量入口。
+LoadBalancer
+LoadBalancer
只能在service上定义。这是公有云提供的负载均衡器,如AWS、Azure、CloudStack、GCE等。
+kind: Service
+apiVersion: v1
+metadata:
+ name: influxdb
+spec:
+ type: LoadBalancer
+ ports:
+ - port: 8086
+ selector:
+ name: influxdb
+
+查看服务:
+$ kubectl get svc influxdb
+NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
+influxdb 10.97.121.42 10.13.242.236 8086:30051/TCP 39s
+
+内部可以使用ClusterIP加端口来访问服务,如19.97.121.42:8086。
+外部可以用以下两种方式访问该服务:
+
+- 使用任一节点的IP加30051端口访问该服务
+- 使用
EXTERNAL-IP
来访问,这是一个VIP,是云供应商提供的负载均衡器IP,如10.13.242.236:8086。
+
+Ingress
+Ingress
是自kubernetes1.1版本后引入的资源类型。必须要部署Ingress controller才能创建Ingress资源,Ingress controller是以一种插件的形式提供。Ingress controller 是部署在Kubernetes之上的Docker容器。它的Docker镜像包含一个像nginx或HAProxy的负载均衡器和一个控制器守护进程。控制器守护程序从Kubernetes接收所需的Ingress配置。它会生成一个nginx或HAProxy配置文件,并重新启动负载平衡器进程以使更改生效。换句话说,Ingress controller是由Kubernetes管理的负载均衡器。
+Kubernetes Ingress提供了负载平衡器的典型特性:HTTP路由,粘性会话,SSL终止,SSL直通,TCP和UDP负载平衡等。目前并不是所有的Ingress controller都实现了这些功能,需要查看具体的Ingress controller文档。
+apiVersion: extensions/v1beta1
+kind: Ingress
+metadata:
+ name: influxdb
+spec:
+ rules:
+ - host: influxdb.kube.example.com
+ http:
+ paths:
+ - backend:
+ serviceName: influxdb
+ servicePort: 8086
+
+外部访问URL http://influxdb.kube.example.com/ping 访问该服务,入口就是80端口,然后Ingress controller直接将流量转发给后端Pod,不需再经过kube-proxy的转发,比LoadBalancer方式更高效。
+总结
+总的来说Ingress是一个非常灵活和越来越得到厂商支持的服务暴露方式,包括Nginx、HAProxy、Traefik,还有各种Service Mesh,而其它服务暴露方式可以更适用于服务调试、特殊应用的部署。
+参考
+Accessing Kubernetes Pods from Outside of the Cluster - alesnosek.com
+
+
+
+
+
+
+
+
+
results matching ""
+
+
+
+
+
+
No results matching ""
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/guide/application-development-deployment-flow.html b/guide/application-development-deployment-flow.html
index e8c269d2d..b34102f54 100644
--- a/guide/application-development-deployment-flow.html
+++ b/guide/application-development-deployment-flow.html
@@ -82,7 +82,7 @@
-
+
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2376,7 +2391,7 @@
-
+
@@ -2392,7 +2407,7 @@
diff --git a/guide/auth-with-kubeconfig-or-token.html b/guide/auth-with-kubeconfig-or-token.html
index 1f02a8ef0..5df44dbcc 100644
--- a/guide/auth-with-kubeconfig-or-token.html
+++ b/guide/auth-with-kubeconfig-or-token.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2463,7 +2478,7 @@ ca.crt: 1310 bytes
diff --git a/guide/authenticate-across-clusters-kubeconfig.html b/guide/authenticate-across-clusters-kubeconfig.html
index 7ba377769..85bd130e0 100644
--- a/guide/authenticate-across-clusters-kubeconfig.html
+++ b/guide/authenticate-across-clusters-kubeconfig.html
@@ -4,7 +4,7 @@
- 使用 kubeconfig 文件配置跨集群认证 · Kubernetes Handbook - jimmysong.io
+ 使用kubeconfig文件配置跨集群认证 · Kubernetes Handbook - jimmysong.io
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2329,7 +2344,7 @@
@@ -2616,7 +2631,7 @@ $ kubectl config use-context federal-context
diff --git a/guide/authentication.html b/guide/authentication.html
index 0031ca328..229d24ffd 100644
--- a/guide/authentication.html
+++ b/guide/authentication.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2881,7 +2896,7 @@ tar xzf easy-rsa.tar.gz
-
+
@@ -2892,7 +2907,7 @@ tar xzf easy-rsa.tar.gz
diff --git a/guide/cluster-security-management.html b/guide/cluster-security-management.html
index 3d6e2431a..3473186df 100644
--- a/guide/cluster-security-management.html
+++ b/guide/cluster-security-management.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2391,7 +2406,7 @@
diff --git a/guide/command-usage.html b/guide/command-usage.html
index 3cdfce727..bd95514d1 100644
--- a/guide/command-usage.html
+++ b/guide/command-usage.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2391,7 +2406,7 @@
diff --git a/guide/configure-liveness-readiness-probes.html b/guide/configure-liveness-readiness-probes.html
index ba8a892b8..6505df790 100644
--- a/guide/configure-liveness-readiness-probes.html
+++ b/guide/configure-liveness-readiness-probes.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2580,7 +2595,7 @@ the Container has been restarted:
diff --git a/guide/configure-pod-service-account.html b/guide/configure-pod-service-account.html
index 6045e874e..b8ec61530 100644
--- a/guide/configure-pod-service-account.html
+++ b/guide/configure-pod-service-account.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2538,7 +2553,7 @@ serviceaccounts/default
diff --git a/guide/connecting-to-applications-port-forward.html b/guide/connecting-to-applications-port-forward.html
index 6c6375426..16dda601f 100644
--- a/guide/connecting-to-applications-port-forward.html
+++ b/guide/connecting-to-applications-port-forward.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2414,12 +2429,12 @@ kubectl get pods redis-master --template='{{(index (index .spec.containers
-
+
-
+
@@ -2430,7 +2445,7 @@ kubectl get pods redis-master --template='{{(index (index .spec.containers
diff --git a/guide/deploy-applications-in-kubernetes.html b/guide/deploy-applications-in-kubernetes.html
index 433f74467..4b40aa630 100644
--- a/guide/deploy-applications-in-kubernetes.html
+++ b/guide/deploy-applications-in-kubernetes.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2430,7 +2445,7 @@
diff --git a/guide/docker-cli-to-kubectl.html b/guide/docker-cli-to-kubectl.html
index 146248803..5f436cc28 100644
--- a/guide/docker-cli-to-kubectl.html
+++ b/guide/docker-cli-to-kubectl.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2567,7 +2582,7 @@ InfluxDB is running at https://108.59.85.141/api/v1/namespaces/kube-system/servi
diff --git a/guide/index.html b/guide/index.html
index 5d8683200..2132b8cf5 100644
--- a/guide/index.html
+++ b/guide/index.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2395,7 +2410,7 @@
diff --git a/guide/ip-masq-agent.html b/guide/ip-masq-agent.html
index 07ac1038a..919b2906d 100644
--- a/guide/ip-masq-agent.html
+++ b/guide/ip-masq-agent.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2455,7 +2470,7 @@ MASQUERADE all -- anywhere anywhere /* ip-masq-agent:
diff --git a/guide/kubectl-cheatsheet.html b/guide/kubectl-cheatsheet.html
index 741b40bb8..58536429e 100644
--- a/guide/kubectl-cheatsheet.html
+++ b/guide/kubectl-cheatsheet.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2797,7 +2812,7 @@ $ kubectl taint nodes foo dedicated=special-user:NoSchedule
diff --git a/guide/kubectl-user-authentication-authorization.html b/guide/kubectl-user-authentication-authorization.html
index 46d6a9762..25b0b8d4d 100644
--- a/guide/kubectl-user-authentication-authorization.html
+++ b/guide/kubectl-user-authentication-authorization.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2488,7 +2503,7 @@ No resources found.
diff --git a/guide/kubelet-authentication-authorization.html b/guide/kubelet-authentication-authorization.html
index 00d03dbd7..c0560fb08 100644
--- a/guide/kubelet-authentication-authorization.html
+++ b/guide/kubelet-authentication-authorization.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2503,7 +2518,7 @@
diff --git a/guide/managing-tls-in-a-cluster.html b/guide/managing-tls-in-a-cluster.html
index 6cc68df56..45cd5cc05 100644
--- a/guide/managing-tls-in-a-cluster.html
+++ b/guide/managing-tls-in-a-cluster.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2481,7 +2496,7 @@ my-svc.my-namespace 10m yourname@example.com Approved,Issued
diff --git a/guide/migrating-hadoop-yarn-to-kubernetes.html b/guide/migrating-hadoop-yarn-to-kubernetes.html
index b63f02760..bf79f458a 100644
--- a/guide/migrating-hadoop-yarn-to-kubernetes.html
+++ b/guide/migrating-hadoop-yarn-to-kubernetes.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2561,7 +2576,7 @@ kubectl create configmap spark-config \
diff --git a/guide/rbac.html b/guide/rbac.html
index fe194856e..cd93be5b0 100644
--- a/guide/rbac.html
+++ b/guide/rbac.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2918,7 +2933,7 @@
diff --git a/guide/resource-configuration.html b/guide/resource-configuration.html
index 617459c01..d30faa82b 100644
--- a/guide/resource-configuration.html
+++ b/guide/resource-configuration.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2391,7 +2406,7 @@
diff --git a/guide/resource-quota-management.html b/guide/resource-quota-management.html
index ffb42820b..4c3a1f09d 100644
--- a/guide/resource-quota-management.html
+++ b/guide/resource-quota-management.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2463,7 +2478,7 @@
diff --git a/guide/secret-configuration.html b/guide/secret-configuration.html
index 670e1b8be..0ab694d5e 100644
--- a/guide/secret-configuration.html
+++ b/guide/secret-configuration.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2812,7 +2827,7 @@ secret "test-db-secret" created
diff --git a/guide/service-access-application-cluster.html b/guide/service-access-application-cluster.html
index f9db4cc01..b327bcef6 100644
--- a/guide/service-access-application-cluster.html
+++ b/guide/service-access-application-cluster.html
@@ -4,7 +4,7 @@
- 使用 service 访问群集中的应用程序 · Kubernetes Handbook - jimmysong.io
+ 使用service访问群集中的应用程序 · Kubernetes Handbook - jimmysong.io
@@ -79,7 +79,7 @@
-
+
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2329,7 +2344,7 @@
@@ -2450,7 +2465,7 @@ kubectl describe replicasets
-
+
@@ -2461,7 +2476,7 @@ kubectl describe replicasets
diff --git a/guide/tls-bootstrapping.html b/guide/tls-bootstrapping.html
index bafafbe41..f82df0701 100644
--- a/guide/tls-bootstrapping.html
+++ b/guide/tls-bootstrapping.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2508,7 +2523,7 @@
diff --git a/guide/using-kubectl.html b/guide/using-kubectl.html
index e88a745d2..07a2cfa8d 100644
--- a/guide/using-kubectl.html
+++ b/guide/using-kubectl.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2418,7 +2433,7 @@
diff --git a/guide/using-statefulset.html b/guide/using-statefulset.html
index e203cfcdb..f93331722 100644
--- a/guide/using-statefulset.html
+++ b/guide/using-statefulset.html
@@ -934,7 +934,7 @@
3.5.
- 访问 Kubernetes 集群
+ 访问Kubernetes集群
@@ -965,7 +965,7 @@
3.5.2.
- 使用 kubeconfig 文件配置跨集群认证
+ 使用kubeconfig文件配置跨集群认证
@@ -995,7 +995,22 @@
3.5.4.
- 使用 service 访问群集中的应用程序
+ 使用service访问群集中的应用程序
+
+
+
+
+
+
+
+
+
+
+
+
+ 3.5.5.
+
+ 从外部访问Kubernetes中的Pod
@@ -2685,7 +2700,7 @@ sed -i s'/zookeeper.connect=localhost:2181/zookee
diff --git a/images/redpoint-faas-landscape.jpg b/images/redpoint-faas-landscape.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..48b3566a82d23de6fe023c4e1abf23f470262d33
GIT binary patch
literal 181238
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