Kubernetes: 构成组件清单
我整理了Kubernetes的配置组件清单。这是基于Kubernetes 1.2版本的信息。
组件列表
说明:外部项目
建筑图
主控制元件 (Zhǔ
etcd
etcd是一种用于持久化Kubernetes资源的高可靠性分布式键值存储系统。除了用于Kubernetes资源之外,etcd还用于保存SkyDNS、pod-master等内容(etcd实例通常是独立的)。
etcdのキーはパス形式になっており、API Serverの–etcd-prefixオプション(デフォルトは/registry)で指定したディレクトリ以下に保存されます。。また–etcd-servers-overridesオプションでリソースの種類ごとにetcdのサーバーを変えることも可能です。大規模環境においてはEventsリソースは量が多いため、etcdインスタンスを別にすることが推奨されています。詳細はKubernetesマニュアルのkube-apiserverとUsing Large Clustersの項を参照ください。
etcd是由CoreOS公司开发的Linux容器发行版。
请参考
- https://github.com/coreos/etcd
参考:存储在etcd中的数据示例
Kubernetes资源的etcd键以以下方式存储。
# etcdの"/registry"以下のキー名を表示
$ etcdctl ls --recursive /registry
# サンプルを抜粋
/registry/namespaces/default
/registry/namespaces/kube-system
/registry/secrets/default/default-token-qfomx
/registry/secrets/kube-system/default-token-bf0m1
/registry/minions/172.17.4.101
/registry/minions/172.17.4.201
/registry/pods/kube-system/kube-controller-manager-172.17.4.101
/registry/pods/kube-system/heapster-v10-ut5ls
value中直接包含着资源的JSON字符串。
$ etcdctl get /registry/ranges/serviceips | jq .
{
"kind": "RangeAllocation",
"apiVersion": "v1",
"metadata": {
"creationTimestamp": null
},
"range": "10.3.0.0/24",
"data": "IAAACAAAAAAIAAAAAAAAAAAAAAAAAAABAAAAAAADAQ=="
}
Kubernetes API服务器
KubernetesのAPIサーバーで、主にKubernetesのリソース情報の管理を担っています。基本的にリソース情報のCRUD処理のみを行い、リソースに対する実際の処理やスケジューリングは別のコンポーネント(kube-controller-managerとkube-scheduler)が行います。リソースの状態はすべてetcdに保存されます。APIサーバー以外のコンポーネントは直接etcdを参照せず、APIサーバーを通してリソースにアクセスします。kubectlコマンドも、APIサーバーへのアクセスを通して操作を行っています。
認証、認可の他に、Admission Control (参考: Kubernetes: Admission Controlとは何か) というリクエスト制御の仕組みを備えています。
这是一个能够进行水平扩展的组件。
请您提供更多的上下文或详细的信息。
- http://kubernetes.io/docs/admin/kube-apiserver/
kube-scheduler
Kubernetes调度器
这是一个用于将新创建的Pod节点分配的调度器。它通过Kubernetes API监听Pod、Node等资源,并通过bindings API将Node与Pod绑定。调度器的策略是可配置的,可以通过启动选项–policy-config-file指定配置的json文件。(参考:scheduler-policy-config.json)
参考
- https://github.com/kubernetes/kubernetes/blob/master/docs/devel/scheduler.md
Kube控制器管理器
这个管理器用于启动各种资源的控制器,例如 Replication Controller。每个控制器都在 goroutine 中启动。(参考: controllermanager.go#L185-L390)。值得注意的是,由于 Replication Controller 的资源名称本身就带有 “Controller”,因此控制器被命名为 “RepplicationManager”。(参考: replication_controller.go#L63-L64的评论)
以下是使用pprof查看kube-controller-manager的控制器处理程序的启动goroutine的列表。
k8s.io/kubernetes/pkg/controller/daemon.(*DaemonSetsController).Run
k8s.io/kubernetes/pkg/controller/deployment.(*DeploymentController).Run
k8s.io/kubernetes/pkg/controller/endpoint.(*EndpointController).Run
k8s.io/kubernetes/pkg/controller/gc.(*GCController).Run
k8s.io/kubernetes/pkg/controller/job.(*JobController).Run
k8s.io/kubernetes/pkg/controller/namespace.(*NamespaceController).Run
k8s.io/kubernetes/pkg/controller/node.(*NodeController).Run
k8s.io/kubernetes/pkg/controller/persistentvolume.(*PersistentVolumeClaimBinder).Run
k8s.io/kubernetes/pkg/controller/persistentvolume.(*PersistentVolumeRecycler).Run
k8s.io/kubernetes/pkg/controller/podautoscaler.(*HorizontalController).Run
k8s.io/kubernetes/pkg/controller/replicaset.(*ReplicaSetController).Run
k8s.io/kubernetes/pkg/controller/replication.(*ReplicationManager).Run
k8s.io/kubernetes/pkg/controller/resourcequota.(*ResourceQuotaController).Run
k8s.io/kubernetes/pkg/controller/serviceaccount.(*ServiceAccountsController).Run
k8s.io/kubernetes/pkg/controller/serviceaccount.(*TokensController).Run
仅需一种选项,请原生中文改述以下内容:
参考
- http://kubernetes.io/docs/admin/kube-controller-manager/
节点组件
kubelet(越狱者)
kubelet是在每个节点上运行的代理程序,负责启动和管理节点的主要进程,即Pod。它主要通过监视API服务器以查看分配给自己节点的Pod信息来启动Pod,除此之外还提供了以下三种方法。使用这种机制可以在kubelet上运行包括API服务器在内的Master组件。
ローカルファイル ノードの特定のディレクトリ(例えば/etc/kubernetes/manifests)を監視し、そこに置かれたマニフェストファイルに書かれたPodを起動します。監視するファイルまたはディレクトリは–configオプション、監視間隔は–file-check-frequencyオプション(デフォルトは20秒)で指定します。
HTTPエンドポイント 特定のURLを監視し、そこに置かれたマニフェストファイルに書かれたPodを起動します。監視するURLは–manifest-urlオプション、監視間隔は–http-check-frequency=オプション(デフォルトは20秒)で指定します。
HTTPサーバー Kubelet自体持つのHTTPサーバーに対して、マニフェストを送信する方法です。
请提供更多上下文以便进行翻译。
- http://kubernetes.io/docs/admin/kubelet/
kube-proxy
kube-proxy是在每个节点上运行的网络代理,用于传输Service具有的虚拟Cluster IP。目前只支持轮询负载均衡。
有两种模式可以使用iptables,一种是使用iptables模式的高速模式,另一种是在用户空间进行处理的userspace模式。可以通过启动时的–proxy-mode选项进行指定。如果不指定选项,则如果可用,iptables将被默认选择。还可以使用节点的注释net.experimental.kubernetes.io/proxy-mode来对每个节点进行设置。如果使用iptables模式,循环轮询将由static模块执行。
参照
- http://kubernetes.io/docs/admin/kube-proxy/
其他组件
超级kube(一体化二进制文件)
Hyperkube是将与Kubernetes相关的二进制文件合并为一个的“一体化”二进制文件。您可以通过指定组件名称作为第一个参数来使用它。此外,您还可以将其作为组件名称的符号链接类似于busybox来使用。
每个Kubernetes发布的版本都会更新Docker镜像(gcr.io/google_containers/hyperkube-amd64),如果要在kubelet上运行Kubernetes组件,通常会使用hyperkube的Docker镜像(例如,Master组件的定义文件master.json)。
以下是对应的组件(括号内为原始的二进制文件名)。
-
- kubectl (kubectl)
-
- apiserver (kube-apisever)
-
- controller-manager (kube-controller-manager)
-
- scheduler (kube-scheduler)
-
- kubelet (kubelet)
- proxy (kube-proxy)
$ hyperkube kubectl get nodes
请参考此链接:https://github.com/kubernetes/kubernetes/blob/master/cmd/hyperkube/main.go
暂停容器
暂停容器是一个特殊的容器,它保存着 Pod 内网络命名空间的信息,并自动地添加到所有的 Pod 中。在 Kubernetes 内部,它以常量 PodInfraContainerImage 进行特殊处理,只有暂停容器会保存 Pod 内的网络命名空间信息,而其他容器则采取共享该信息的方式(参考:pkg/kubelet/dockertools/manager.go)。这样,即使 Pod 的其他容器被终止,网络命名空间的信息仍然可被保留。暂停容器本身只需调用 pause 系统调用而不做任何其他操作(参考:pause.asm#L47)。可以使用 kubelet 的 –pod-infra-container-image 选项来更改暂停容器的镜像。(参考: pause.asm#L47)。
只需要一个选项
-
- https://github.com/kubernetes/kubernetes/tree/master/third_party/pause
- Containers at Google > What is the role of ‘pause’ container?
增值组件
播客大师
pod-master是一个容器,用于在High-Availability配置中协调kube-scheduler和kube-controller-manager在哪个Master上运行。它使用etcd进行简单的锁定机制,并且是一个大约200行go程序(参考podmaster.go)。通过获取锁定的Master服务器来反映本地的清单文件,以调整kube-scheduler和kube-controller-manager在哪个Master上运行。可以参考kubernetes存储库中的docs/admin/high-availability中的podmaster.yaml配置示例。
鉴于kube-scheduler和kube-controller-manager本身已实现了领导者选举功能(–leader-elect选项),因此将来可能会不再需要这些组件。(参考 pkg/client/leaderelection)
参考文献
-
- https://github.com/kubernetes/contrib/tree/master/pod-master
-
- http://kubernetes.io/docs/admin/high-availability/
-
- Issue: leaderelection: retrofit controller-manager with leaderelection client #19621
Issue: retrofit the scheduler with the leader election client. #19347
kube-dns 可伯DNS
kube-dns是集群内DNS Pod的名称。当创建Service资源时,会将其注册到kube-dns中,以便从集群内部进行名称解析。默认情况下,使用cluster.local域。Service以{Service名称}.{命名空间}.svc.cluster.local的格式注册到A记录和SRV记录中。
kube-dnsのPodは以下の4コンテナで構成されています。
skydns DNSサーバー
etcd skydnsのデータを保存する専用etcd
kube2sky SkyDNSにKubernetesの情報を反映させるブリッジ
healthz 定期的にnslookupしてヘルスチェックを行う
可以看看
-
- https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns
- http://kubernetes.io/docs/admin/dns/
天空DNS
这是作为集群内DNS使用的DNS服务器(kube-dns的一部分)。etcd用于数据持久化。
参考
- https://github.com/skynetservices/skydns
kube2sky 科比對天
SkyDNSにKubernetesの情報を反映させるブリッジです。KubernetesのAPIでService, Endpoints, Podをwatchし、SkyDNSのetcdに書き込むことでDNSの情報を反映させます。
请参考
- https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/kube2sky
堆史特 (duī shǐ tè)
Heapster是一个用于汇总集群整体使用情况的组件。存储是可插拔的机制,并支持多种存储,如InfluxDB、Google Cloud Monitoring、Kafka等。
引用自http://blog.kubernetes.io/2015/05/resource-usage-monitoring-kubernetes.html的图表中显示
还有一个名为kubedash的性能分析界面的项目也存在。
-
- https://github.com/kubernetes/heapster
- http://blog.kubernetes.io/2015/05/resource-usage-monitoring-kubernetes.html
Helm (部署管理器)
Helm是一个能够将Kubernetes配置模板化并轻松管理部署的机制。这些模板被称为Charts,官方提供了一个名为kubernetes/charts的模板存储库。目前看来,它仍处于开发阶段。可以将其想象为类似于Homebrew的工具,可以在不编写Kubernetes配置文件的情况下进行部署。
$ helm install redis-cluster
# replication controllerやserviceが作られる
看起来使用了名为Jinja的模板,可以展开和自定义Kubernetes的各种设置文件(例如redis.jinja)的机制。
もともとはDeisのHelmというプロジェクトと、Kubernetesチームが開発するdeployment-manager(dm)という2つのツールがあったようです。Integrate helm and dm #171というIssueによると、ハッカソンでこの2つを統合すると決めたらしく、レポジトリ名も”deployment-manager”から”helm”に変更したようです。
-
- http://kubernetes.io/docs/admin/cluster-components/
- https://github.com/kubernetes/kubernetes/blob/master/docs/design/architecture.md
用户界面 (User Interface)
仪表盘
dashboardはKubernetesのダッシュボードのプロジェクトです。kube-uiよりも新しく、kube-uiを置き換えるものです。現状ではUI上からのデプロイや、Podの一覧や詳細情報の表示などを行うことができます。詳細は公式のユーザーガイドをご覧ください。
由于提供了yaml文件,您可以轻松地按照以下方式部署。
# デプロイ
$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml
# UIにアクセスするためにproxyを立ち上げておく
$ kubectl proxy
kubectl proxyでproxyを立てることで、 http://127.0.0.1:8001/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/
でdashboardのUIにアクセスすることができます。
请参照以下内容。
- https://github.com/kubernetes/dashboard
Kube-UI 的中文释义是什么?
kube-ui是一个旧版本的Kubernetes仪表盘。当前最新版本的仪表盘已具备生产就绪条件,所以kube-ui将很快被淘汰。
1. 请参考一下。
2. 请看看这个参考。
3. 请您检查一下这个参考。
4. 这是一个供您参考的。
- https://github.com/kubernetes/kube-ui
Kubedash 酷壳
这是一个显示Kubernetes性能信息的仪表板,它利用Heapster提供的信息。您可以查看整个集群的信息,以及每个节点和每个命名空间的CPU和内存使用率。
有一份yaml文件可用,您可以简单地根据以下方式进行部署。
# デプロイ
$ kubectl create -f https://raw.githubusercontent.com/kubernetes/kubedash/master/deploy/bundle.yaml
# UIにアクセスするためにproxyを立ち上げておく
$ kubectl proxy
通过使用kubectl proxy命令,在http://127.0.0.1:8001/api/v1/proxy/namespaces/kube-system/services/kubedash/#!/ 上可以访问kubedash的用户界面。
参考以下内容并用中文进行本地化。只需要一种选项:
– 请参考以下信息。
– 请根据以下内容进行参考。
– 请参照下述信息。
– 请参考下列内容。
– 请考虑下列参考。
- https://github.com/kubernetes/kubedash