## 訪問集群
### 第一次使用 kubectl 訪問
如果您是第一次訪問 Kubernetes API 的話,我們建議您使用 Kubernetes 命令行工具:`kubectl`。
為了訪問集群,您需要知道集群的地址,并且需要有訪問它的憑證。通常,如果您完成了 [入門指南](https://kubernetes.io/docs/getting-started-guides) 那么這些將會自動設置,或者其他人為您部署的集群提供并給您憑證和集群地址。
使用下面的命令檢查 kubectl 已知的集群的地址和憑證:
```bash
$ kubectl config view
```
### 直接訪問 REST API
Kubectl 處理對 apiserver 的定位和認證。如果您想直接訪問 REST API,可以使用像 curl、wget 或瀏覽器這樣的 http 客戶端,有以下幾種方式來定位和認證:
- 以 proxy 模式運行 kubectl。
- 推薦方法。
- 使用已保存的 apiserver 位置信息。
- 使用自簽名證書驗證 apiserver 的身份。 沒有 MITM(中間人攻擊)的可能。
- 認證到 apiserver。
- 將來,可能會做智能的客戶端負載均衡和故障轉移。
- 直接向 http 客戶端提供位置和憑據。
- 替代方法。
- 適用于通過使用代理而混淆的某些類型的客戶端代碼。
- 需要將根證書導入瀏覽器以防止 MITM。
#### 使用 kubectl proxy
以下命令作為反向代理的模式運行 kubectl。 它處理對 apiserver 的定位并進行認證。
像這樣運行:
```bash
$ kubectl proxy --port=8080 &
```
然后您可以使用 curl、wget 或者瀏覽器來訪問 API,如下所示:
```bash
$ curl http://localhost:8080/api/
{
"versions": [
"v1"
]
}
```
#### 不使用 kubectl proxy(1.3.x 以前版本)
通過將認證 token 直接傳遞給 apiserver 的方式,可以避免使用 kubectl proxy,如下所示:
```bash
$ APISERVER=$(kubectl config view | grep server | cut -f 2- -d ":" | tr -d " ")
$ TOKEN=$(kubectl config view | grep token | cut -f 2 -d ":" | tr -d " ")
$ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
{
"versions": [
"v1"
]
}
```
#### 不使用 kubectl proxy(1.3.x 以后版本)
在 Kubernetes 1.3 或更高版本中,`kubectl config view` 不再顯示 token。 使用 `kubectl describe secret …` 獲取 default service account 的 token,如下所示:
```bash
$ APISERVER=$(kubectl config view | grep server | cut -f 2- -d ":" | tr -d " ")
$ TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t')
$ curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
```
以上示例使用`--insecure` 標志。 這使得它容易受到 MITM 攻擊。 當 kubectl 訪問集群時,它使用存儲的根證書和客戶端證書來訪問服務器。 (這些安裝在`~/.kube`目錄中)。 由于集群證書通常是自簽名的,因此可能需要特殊配置才能讓您的 http 客戶端使用根證書。
對于某些群集,apiserver 可能不需要身份驗證;可以選擇在本地主機上服務,或者使用防火墻保護。 對此還沒有一個標準。[配置對API的訪問](https://kubernetes.io/docs/admin/accessing-the-api) 描述了群集管理員如何配置此操作。 這種方法可能與未來的高可用性支持相沖突。
### 編程訪問 API
Kubernetes 支持 [Go](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#go-client) 和 [Python](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#python-client) 客戶端庫。
#### Go 客戶端
- 要獲取該庫,請運行以下命令:`go get k8s.io/client-go/<version number>/kubernetes` 請參閱 [https://github.com/kubernetes/client-go](https://github.com/kubernetes/client-go) 以查看支持哪些版本。
- 使用 client-go 客戶端編程。請注意,client-go 定義了自己的 API 對象,因此如果需要,請從 client-go 而不是從主存儲庫導入 API 定義,例如導入 `k8s.io/client-go/1.4/pkg/api/v1` 是正確的。
Go 客戶端可以使用與 kubectl 命令行工具相同的 [kubeconfig 文件](https://kubernetes.io/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig) 來定位和驗證 apiserver。參考官方 [示例](https://git.k8s.io/client-go/examples/out-of-cluster-client-configuration/main.go) 和 [client-go 示例](../develop/client-go-sample.md)。
如果應用程序在群集中以 Pod 的形式部署,請參考 [下一節](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#accessing-the-api-from-a-pod)。
#### Python 客戶端
要使用 [Python client](https://github.com/kubernetes-incubator/client-python),請運行以下命令:`pip install kubernetes`。查看 [Python 客戶端庫頁面](https://github.com/kubernetes-incubator/client-python) 獲取更多的安裝選擇。
Python 客戶端可以使用與 kubectl 命令行工具相同的 [kubeconfig 文件](https://kubernetes.io/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig) 來定位和驗證 apiserver。參考該 [示例](https://github.com/kubernetes-incubator/client-python/tree/master/examples/example1.py)。
#### 其他語言
還有更多的客戶端庫可以用來訪問 API。有關其他庫的驗證方式,請參閱文檔。
### 在 Pod 中訪問 API
在 Pod 中訪問 API 時,定位和認證到 API server 的方式有所不同。在 Pod 中找到 apiserver 地址的推薦方法是使用kubernetes DNS 名稱,將它解析為服務 IP,后者又將被路由到 apiserver。
向 apiserver 認證的推薦方法是使用 [service account](https://kubernetes.io/docs/user-guide/service-accounts) 憑據。通過 kube-system,pod 與 service account 相關聯,并且將該 service account 的憑據(token)放入該 pod 中每個容器的文件系統樹中,位于 `/var/run/secrets/kubernetes.io/serviceaccount/token`。
如果可用,證書包將位于每個容器的文件系統樹的 `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` 位置,并用于驗證 apiserver 的服務證書。
最后,用于 namespace API 操作的默認 namespace 放在每個容器中的 `/var/run/secrets/kubernetes.io/serviceaccount/namespace` 中。
在 pod 中,連接到 API 的推薦方法是:
- 將 kubectl proxy 作為 pod 中的一個容器來運行,或作為在容器內運行的后臺進程。它將 Kubernetes API 代理到 pod 的本地主機接口,以便其他任何 pod 中的容器內的進程都可以訪問它。
- 使用 Go 客戶端庫,并使用 `rest.InClusterConfig()` 和 `kubernetes.NewForConfig()` 函數創建一個客戶端。
他們處理對 apiserver 的定位和認證。[示例](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go)
在以上的幾種情況下,都需要使用 pod 的憑據與 apiserver 進行安全通信。
## 訪問集群中運行的 service
上一節是關于連接到 kubernetes API server。這一節是關于連接到 kubernetes 集群中運行的 service。在 Kubernetes 中,[node](https://kubernetes.io/docs/admin/node)、 [pod](https://kubernetes.io/docs/user-guide/pods) 和 [services](https://kubernetes.io/docs/user-guide/services) 都有它們自己的 IP。很多情況下,集群中 node 的 IP、Pod 的 IP、service 的 IP 都是不可路由的,因此在集群外面的機器就無法訪問到它們,例如從您自己的筆記本電腦。
### 連接的方式
您可以選擇以下幾種方式從集群外部連接到 node、pod 和 service:
- 通過 public IP 訪問 service。
- 使用 `NodePort` 和 `LoadBalancer` 類型的 service,以使 service 能夠在集群外部被訪問到。
- 根據您的群集環境,這可能會將服務暴露給您的公司網絡,或者可能會將其暴露在互聯網上。想想暴露的服務是否安全。它是否自己進行身份驗證?
- 將 pod 放在服務后面。 要從一組副本(例如為了調試)訪問一個特定的 pod,請在 pod 上放置一個唯一的 label,并創建一個選擇該 label 的新服務。
- 在大多數情況下,應用程序開發人員不需要通過 node IP 直接訪問節點。
- 通過 Proxy 規則訪問 service、node、pod。
- 在訪問遠程服務之前,請執行 apiserver 認證和授權。 如果服務不夠安全,無法暴露給互聯網,或者為了訪問節點 IP 上的端口或進行調試,請使用這種方式。
- 代理可能會導致某些 Web 應用程序出現問題。
- 僅適用于 HTTP/HTTPS。
- [見此描述](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#manually-constructing-apiserver-proxy-urls)。
- 在集群內訪問 node 和 pod。
- 運行一個 pod,然后使用 kubectl exec 命令連接到 shell。從該 shell 中連接到其他 node、pod 和 service。
- 有些集群可能允許 ssh 到集群上的某個節點。 從那個節點您可以訪問到集群中的服務。這是一個非標準的方法,它可能將在某些集群上奏效,而在某些集群不行。這些節點上可能安裝了瀏覽器和其他工具也可能沒有。群集 DNS 可能無法正常工作。
### 訪問內置服務
通常集群內會有幾個在 kube-system 中啟動的服務。使用 `kubectl cluster-info` 命令獲取該列表:
```bash
$ kubectl cluster-info
Kubernetes master is running at https://104.197.5.247
elasticsearch-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
kibana-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kibana-logging/proxy
kube-dns is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kube-dns/proxy
grafana is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy
```
這顯示了訪問每個服務的代理 URL。
例如,此集群啟用了集群級日志記錄(使用Elasticsearch),如果傳入合適的憑據,可以在該地址 `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/` 訪問到,或通過 kubectl 代理,例如:`http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`。
(有關如何傳遞憑據和使用 kubectl 代理,請 [參閱上文](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#accessing-the-cluster-api))
#### 手動構建 apiserver 代理 URL
如上所述,您可以使用 `kubectl cluster-info` 命令來檢索服務的代理 URL。要創建包含服務端點、后綴和參數的代理 URL,您只需附加到服務的代理URL:
`http://`*kubernetes_master_address*`/api/v1/namespaces/`*namespace_name*`/services/`*service_name[:port_name]*`/proxy`
如果您沒有指定 port 的名字,那么您不必在 URL 里指定 port_name。
##### 示例
- 要想訪問 Elasticsearch 的服務端點 `_search?q=user:kimchy`,您需要使用:`http://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy`
- 要想訪問 Elasticsearch 的集群健康信息 `_cluster/health?pretty=true`,您需要使用:`https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true`
```json
{
"cluster_name" : "kubernetes_logging",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 5,
"active_shards" : 5,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 5
}
```
#### 使用 web 瀏覽器來訪問集群中運行的服務
您可以將 apiserver 代理網址放在瀏覽器的地址欄中。 然而:
- Web 瀏覽器通常不能傳遞 token,因此您可能需要使用基本(密碼)認證。 Apiserver 可以配置為接受基本認證,但您的集群可能未配置為接受基本認證。
- 某些網絡應用程序可能無法正常工作,特別是那些在不知道代理路徑前綴的情況下構造 URL 的客戶端 JavaScript。
## 請求重定向
重定向功能已被棄用和刪除。 請改用代理(見下文)。
## 多種代理
在使用 kubernetes 的時候您可能會遇到許多種不同的代理:
1. [kubectl 代理](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#directly-accessing-the-rest-api):
- 在用戶桌面或 pod 中運行
- 從 localhost 地址到 Kubernetes apiserver 的代理
- 客戶端到代理使用 HTTP
- apiserver 的代理使用 HTTPS
- 定位 apiserver
- 添加身份驗證 header
2. [apiserver 代理](https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster.md#discovering-builtin-services):
- 將一個堡壘機作為 apiserver
- 將群集之外的用戶連接到群集IP,否則可能無法訪問
- 在 apiserver 進程中運行
- 客戶端到代理使用 HTTPS(或 http,如果 apiserver 如此配置)
- 根據代理目標的可用信息由代理選擇使用 HTTP 或 HTTPS
- 可用于訪問 node、pod 或 service
- 用于訪問 service 時進行負載均衡
3. [kube 代理](https://kubernetes.io/docs/user-guide/services/#ips-and-vips):
- 在每個節點上運行
- 代理 UDP 和 TCP
- 不支持 HTTP
- 提供負載均衡
- 只是用來訪問 service
4. apiserver 前面的代理/負載均衡器:
- 存在和實現因群集而異(例如 nginx)
- 位于所有客戶端和一個或多個 apiserver 之間
- 作為負載均衡器,如果有多個 apiserver
5. 外部服務的云負載均衡器:
- 由一些云提供商提供(例如 AWS ELB,Google Cloud Load Balancer)
- 當 Kubernetes service 類型為 LoadBalancer 時,會自動創建
- 僅使用 UDP/TCP
- 實施方式因云提供商而異
- 序言
- 云原生
- 云原生(Cloud Native)的定義
- CNCF - 云原生計算基金會簡介
- CNCF章程
- 云原生的設計哲學
- Play with Kubernetes
- 快速部署一個云原生本地實驗環境
- Kubernetes與云原生應用概覽
- 云原生應用之路——從Kubernetes到Cloud Native
- 云原生編程語言
- 云原生編程語言Ballerina
- 云原生編程語言Pulumi
- 云原生的未來
- Kubernetes架構
- 設計理念
- Etcd解析
- 開放接口
- CRI - Container Runtime Interface(容器運行時接口)
- CNI - Container Network Interface(容器網絡接口)
- CSI - Container Storage Interface(容器存儲接口)
- Kubernetes中的網絡
- Kubernetes中的網絡解析——以flannel為例
- Kubernetes中的網絡解析——以calico為例
- 具備API感知的網絡和安全性管理開源軟件Cilium
- Cilium架構設計與概念解析
- 資源對象與基本概念解析
- Pod狀態與生命周期管理
- Pod概覽
- Pod解析
- Init容器
- Pause容器
- Pod安全策略
- Pod的生命周期
- Pod Hook
- Pod Preset
- Pod中斷與PDB(Pod中斷預算)
- 集群資源管理
- Node
- Namespace
- Label
- Annotation
- Taint和Toleration(污點和容忍)
- 垃圾收集
- 控制器
- Deployment
- StatefulSet
- DaemonSet
- ReplicationController和ReplicaSet
- Job
- CronJob
- Horizontal Pod Autoscaling
- 自定義指標HPA
- 準入控制器(Admission Controller)
- 服務發現
- Service
- Ingress
- Traefik Ingress Controller
- 身份與權限控制
- ServiceAccount
- RBAC——基于角色的訪問控制
- NetworkPolicy
- 存儲
- Secret
- ConfigMap
- ConfigMap的熱更新
- Volume
- Persistent Volume(持久化卷)
- Storage Class
- 本地持久化存儲
- 集群擴展
- 使用自定義資源擴展API
- 使用CRD擴展Kubernetes API
- Aggregated API Server
- APIService
- Service Catalog
- 資源調度
- QoS(服務質量等級)
- 用戶指南
- 資源對象配置
- 配置Pod的liveness和readiness探針
- 配置Pod的Service Account
- Secret配置
- 管理namespace中的資源配額
- 命令使用
- Docker用戶過度到kubectl命令行指南
- kubectl命令概覽
- kubectl命令技巧大全
- 使用etcdctl訪問kubernetes數據
- 集群安全性管理
- 管理集群中的TLS
- kubelet的認證授權
- TLS bootstrap
- 創建用戶認證授權的kubeconfig文件
- IP偽裝代理
- 使用kubeconfig或token進行用戶身份認證
- Kubernetes中的用戶與身份認證授權
- Kubernetes集群安全性配置最佳實踐
- 訪問Kubernetes集群
- 訪問集群
- 使用kubeconfig文件配置跨集群認證
- 通過端口轉發訪問集群中的應用程序
- 使用service訪問群集中的應用程序
- 從外部訪問Kubernetes中的Pod
- Cabin - Kubernetes手機客戶端
- Kubernetic - Kubernetes桌面客戶端
- Kubernator - 更底層的Kubernetes UI
- 在Kubernetes中開發部署應用
- 適用于kubernetes的應用開發部署流程
- 遷移傳統應用到Kubernetes中——以Hadoop YARN為例
- 最佳實踐概覽
- 在CentOS上部署Kubernetes集群
- 創建TLS證書和秘鑰
- 創建kubeconfig文件
- 創建高可用etcd集群
- 安裝kubectl命令行工具
- 部署master節點
- 安裝flannel網絡插件
- 部署node節點
- 安裝kubedns插件
- 安裝dashboard插件
- 安裝heapster插件
- 安裝EFK插件
- 生產級的Kubernetes簡化管理工具kubeadm
- 使用kubeadm在Ubuntu Server 16.04上快速構建測試集群
- 服務發現與負載均衡
- 安裝Traefik ingress
- 分布式負載測試
- 網絡和集群性能測試
- 邊緣節點配置
- 安裝Nginx ingress
- 安裝配置DNS
- 安裝配置Kube-dns
- 安裝配置CoreDNS
- 運維管理
- Master節點高可用
- 服務滾動升級
- 應用日志收集
- 配置最佳實踐
- 集群及應用監控
- 數據持久化問題
- 管理容器的計算資源
- 集群聯邦
- 存儲管理
- GlusterFS
- 使用GlusterFS做持久化存儲
- 使用Heketi作為Kubernetes的持久存儲GlusterFS的external provisioner
- 在OpenShift中使用GlusterFS做持久化存儲
- GlusterD-2.0
- Ceph
- 用Helm托管安裝Ceph集群并提供后端存儲
- 使用Ceph做持久化存儲
- 使用rbd-provisioner提供rbd持久化存儲
- OpenEBS
- 使用OpenEBS做持久化存儲
- Rook
- NFS
- 利用NFS動態提供Kubernetes后端存儲卷
- 集群與應用監控
- Heapster
- 使用Heapster獲取集群和對象的metric數據
- Prometheus
- 使用Prometheus監控kubernetes集群
- Prometheus查詢語言PromQL使用說明
- 使用Vistio監控Istio服務網格中的流量
- 分布式跟蹤
- OpenTracing
- 服務編排管理
- 使用Helm管理Kubernetes應用
- 構建私有Chart倉庫
- 持續集成與發布
- 使用Jenkins進行持續集成與發布
- 使用Drone進行持續集成與發布
- 更新與升級
- 手動升級Kubernetes集群
- 升級dashboard
- 領域應用概覽
- 微服務架構
- 微服務中的服務發現
- 使用Java構建微服務并發布到Kubernetes平臺
- Spring Boot快速開始指南
- Service Mesh 服務網格
- 企業級服務網格架構
- Service Mesh基礎
- Service Mesh技術對比
- 采納和演進
- 定制和集成
- 總結
- Istio
- 安裝并試用Istio service mesh
- 配置請求的路由規則
- 安裝和拓展Istio service mesh
- 集成虛擬機
- Istio中sidecar的注入規范及示例
- 如何參與Istio社區及注意事項
- Istio教程
- Istio免費學習資源匯總
- 深入理解Istio Service Mesh中的Envoy Sidecar注入與流量劫持
- 深入理解Istio Service Mesh中的Envoy Sidecar代理的路由轉發
- Linkerd
- Linkerd 使用指南
- Conduit
- Condiut概覽
- 安裝Conduit
- Envoy
- Envoy的架構與基本術語
- Envoy作為前端代理
- Envoy mesh教程
- SOFAMesh
- SOFAMesh中的Dubbo on x-protocol
- SOFAMosn
- 使用 SOFAMosn 構建 SOFAMesh
- 大數據
- Spark standalone on Kubernetes
- 運行支持Kubernetes原生調度的Spark程序
- Serverless架構
- 理解Serverless
- FaaS-函數即服務
- OpenFaaS快速入門指南
- 邊緣計算
- 人工智能