按照顺序学习Kubernetes的基础知识 – 通过在本地环境创建Kubernetes集群以理解Kubernetes的概念
こちらの記事は、Jonathan Natanael Siahaan 氏により2019年 10月に公開された『 Step by Step Introduction to Basic Concept of Kubernetes 』の和訳です。
本記事は原著者から許可を得た上で記事を公開しています。
Kubernetesを聞いたことがありますか?
興味があることは間違いないはずです。
だからこそこの記事を開いたのでしょう。
この記事では、Kubernetesの基本概念とその使い方について説明します。
最終的には、Minikube上で動くKubernetesを使用してdockerコンテナを動かします。
不需要付费账户才能使用云服务。
Kubernetes是什么?
Kubernetesは、Googleが作成したオープンソースのプラットフォーム/ツールです。
GO-Langで書かれています。
そのため、現在KubernetesはApache 2.0ライセンスの下でのオープンソースプロジェクトとなっています。
業界では、Kubernetesは「K8s」としても知られています。
Kubernetesを使うと、プライベート、パブリック、およびハイブリッドクラウド環境で任意のLinuxコンテナを動かすことができます。
Kubernetesは、ロードバランサー、サービスディスカバリー、ロールベースアクセス制御(RBAC)などの周辺機能も提供します。
(訳注)サービスディスカバリーとは、サービスとIPを紐づける機構のこと。これによりコンテナの作成・削除に伴ってIPが変わっても通信が可能となる。
为什么需要Kubernetes?
答えは、コンテナの管理を支援するためです。
多くのコンテナを使用しマイクロサービスパターンで本番環境を運用する場合、多くのことを確認する必要があります。
ヘルスチェック、バージョン管理、スケーリング、ロールバック機構など。
これら全てが正常であることを確認するのは非常にイライラするでしょう。
Kubernetesは、コンテナを大規模にデプロイするために必要なオーケストレーションおよび管理機能を提供します。
Kubernetesのオーケストレーション機能を使用すると、複数のコンテナにまたがるアプリケーションサービスを構築し、クラスター全体でそのコンテナのスケジューリング、コンテナのスケーリング、そしてコンテナの状態を管理し続けることができます。
一言で言えば、Kubernetesは多くの部下(コンテナ)を持つマネージャーのようなものです。
マネージャーのすることは、部下が実施する必要のあることを、できるように取り計らうことです。
Kubernetesを使用する前に、新しいマイクロサービスをデプロイするためのインフラを用意する必要があります。
これには数日から数週間かかるでしょう。
Kubernetesが無かったら、大規模なチームはデプロイフローを手動でスクリプト化しなければならないでしょう。
Kubernetesがあると、デプロイスクリプトを手動で作成する必要が無くなり、DevOpsに費やす時間とリソースが減ります。
Kubernetesの主な機能:
-
- 水平スケーリング
-
- 自動スケーリング
-
- ヘルスチェック&自己修復
-
- ロードバランサー
-
- サービスディスカバリー
-
- 自動ロールバック&ロールアウト
カナリアデプロイ
(訳注)一部のユーザにのみ展開する手法のこと。
Kubernetes的工作原理是怎样的?
当你开始阅读官方的 Kubernetes 文档时,可能会因为其中出现大量术语而感到压倒。
为了更深入理解这些概念,有时可能需要一个总览。
在这里,我们提供了 Kubernetes 架构的完整概览图。
如果能对您有所帮助,我会非常高兴。
部署流程:
DevOps → API服务器 → 调度器 → 集群 → 节点 → Kubelet → 容器引擎 → 在Pod内创建容器

从图中可以看出,有很多我不理解的术语。我会逐个进行解释。
师傅
Master是控制集群的元素。
Master有三个要素。
API Server: RESTfulインターフェイスを通じてKubernetesの機能を提供し、クラスターの状態を保持するアプリケーション。
Scheduler: Schedulerは新しいPod要求を受けつけるためにAPI Serverを監視します。
Nodeと通信して新しいPodを作成し、リソースを割り当てたり制約を課しながらNodeにタスクを割り当てます。
Controller Manager: Controllerを動かすMaster上の要素。
Node controller、Endpoint Controller、Namespace Controllerなどが含まれます。
奴隶(节点)
这个机构将执行所需的任务。Kubernetes的Master将对它们进行控制。每个Node内含有四个要素。
Pod: 全てのコンテナはPod内で動きます。
Podは、内部にあるコンテナからネットワークとストレージを抽象化します。
アプリはここで動きます。
Kubelet: KubeletはNodeをクラスターに登録し、Schedulerからのタスク割り当てを監視し、新しいPodをインスタンス化し、Masterに報告します。
(訳注)原文では「Kubectl registering …」とあり、Kubectlが出てきていますが、誤記と思われるため、「Kubelet registering …」と解釈し翻訳しています。なお、KubectlはKubernetesのCLIツールです。
Container Engine: コンテナの管理、イメージのプル、コンテナの停止、コンテナの起動、コンテナの削除などを担当します。
Kube Proxy: アプリユーザーのリクエストを適切なPodに転送します。
退屈だと思うので、ここでは詳細な概念は説明しませ ん。
这篇文章应该更加概述和有趣。
请查看官方文件以获取详细信息。 yǐ .)
请点击这里。
Docker和Kubernetes的操作体验
现在让我们开始行动吧。
在这个部分,我们将使用Github上现有的docker项目,并专注于Kubernetes。
我们将使用Minikube。
Minikube是可以在本地简单运行Kubernetes的工具。
- 请按照Minikube的官方安装文档进行安装。请按照以下步骤操作。
启动Minikube并创建集群。
minikube start
在本地的工作目录中克隆该存储库。
git clone https://github.com/buildkite/nodejs-docker-example.git
请确保您的Docker客户端指向了Minikube的Docker守护进程。
eval $(minikube docker-env)
移动到克隆的存储库目录。
cd nodejs-docker-example
使用此命令创建Docker镜像,并确保在本地运行。
docker build -t example-node-app .
确认Docker镜像已成功创建。
docker images
我们使用名为example-node-app的现有镜像来创建Kubernetes Deployment。该镜像是一个简单的Node HTTP服务器,将在3000端口上公开。我们创建一个名为deployment-script.yaml的文件。
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: kubernetes-deployment
namespace: default
labels:
app: node-app
spec:
replicas: 1
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app-container
image: example-node-app
resources: {}
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
terminationGracePeriodSeconds: 30
然后
kubectl apply -f deployment-script.yaml
node-app Pod启动后,node-app容器在Pod内运行,但要通过公开Service访问,需要等待Pod启动。
确认Pod是否已启动。
kubectl get pod
Pod已经启动并正在运行。
NAME READY STATUS RESTARTS AGE
node-app-3383150820-vctvh 1/1 Running 0 13s
还为时过早,现在高兴还为时尚早。
这里不是结束的地方。
要访问Pod,需要一个服务代理。
ロードバランサーサービスを作成し、targetPort(宛先ポート):3000、port(ユーザーへの公開ポート):8000とします。
下記内容でnode-app-service.yamlというファイルを作成します。
kind: Service
apiVersion: v1
metadata:
name: node-app-service
namespace: default
labels:
app: node-service
spec:
ports:
- protocol: TCP
port: 8000
targetPort: 3000
selector:
app: node-app
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
status:
loadBalancer: {}
执行:
kubectl apply -f node-app-service.yaml
要获取有关服务的信息:
kubectl get service
这将显示出来:
NAME Type EXTERNAL-IP PORT(S) AGE
node-app-service LoadBalancer <pending> 8000:31386/TCP 36m
在使用云基础设施时,创建服务后,创建负载均衡器并将其IP地址写入服务对象可能需要一些时间。那么,为什么即使时间过去了,外部IP仍然处于保留状态呢?
ロードバランサーサービス をサポートしない環境でKubernetesが動いている場合、ロードバランサーは作成されません。
その場合、サービスに付与できるIPが必要です。
Minikube IPを使用できます。
minikube ip
表示されたMinikube IPをコピーし、EXTERNAL-IPサービスに付与します
kubectl patch svc node-app-service -p '{"spec": {"type": "LoadBalancer", "externalIPs":["YOUR_MINIKUBE_IP"]}}'
显示有关服务的信息。
kubectl get service
结果:
NAME Type EXTERNAL-IP PORT(S) AGE
node-app-service LoadBalancer 192.168.99.100 8000:31386/TCP 36m
你可以使用这个IP地址来访问服务,或者可以通过Web浏览器访问。
curl 192.168.99.100:8000
填補
您是否需要一个交互式的UI来展示Kubernetes集群?

ダッシュボードUIはデフォルトでは入っていません。入れるには:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
デフォルトでは、Kubernetesダッシュボードのユーザーは権限が制限されています。
在本节中,我们将创建一个名为eks-admin的服务账户和集群角色绑定,用于以管理员级别的权限安全地连接到仪表盘。
创建一个名为eks-admin-service-account.yaml的文件,内容如下:
这个清单定义了一个名为eks-admin的服务账号和集群角色绑定。
apiVersion: v1
kind: ServiceAccount
metadata:
name: eks-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: eks-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: eks-admin
namespace: kube-system
将服务账户和集群角色绑定应用到集群中。
使用kubectl apply -f eks-admin-service-account.yaml命令。
需要 eks-admin 服务帐户的身份验证令牌。
请从输出结果中复制的值。使用此令牌连接到仪表板。
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}')
输出结果:
Name: eks-admin-token-b5zv4
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=eks-admin kubernetes.io/service-account.uid=bcfe66ac-39be-11e8-97e8-026dce96b6e8
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: <authentication_token>
您可以使用kubectl命令行工具执行以下命令来访问仪表板。
kubectl proxy
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#!/login
にアクセスできます

请引用参考文献。
Kubernetes文档
亚马逊EKS
太好了,终于结束了!?
您是否享受了这个过程呢?
请在下方留下您的评论。
如果有任何问题,请留下评论。我们会进行处理?对于创建此存储库https://github.com/contentful/the-example-app.nodejs的人表示感谢。我能够在本文中将其用作示例应用程序。
在另一篇文章中再次见面吧!
相关文章
- イラストで学ぶ Kubernetes
合作翻译
原作者:Jonathan Natanael Siahaan
感谢你让我们分享你的知识!
此篇文章得以公開,要感謝以下人士的合作:
再次表達感謝之意。
選定負責人:富田由美香
翻譯負責人:@satosansato3
審核負責人:@nyorochan
發布負責人:山田飛驢
期待收到您的意见和想法
请问您对本次文章的感觉如何呢?
我们非常期待您的真实意见,例如:如果可以这样做会更好,希望能更多地做某些方面的改进,或者这样做会更好等等。
我们非常乐意听取您的评价和建议。因为收到的意见会对未来文章的质量改进起到很大作用,所以请随意在评论区留下您的观点。
期待收到大家的留言和信息。