夏の終わりに、Kubernetesのトピックに引き続き取り組んでおり、6月の初めにこのプロジェクトの状況を示すStackoverflowからの記事を公開することを決定したことをお知らせします。
読書を楽しむ!
この記事の執筆時点で、Kubernetesは約6歳であり、過去2年間で人気が高まり、常に最も人気のあるプラットフォームの1つにランクされています。 Kubernetesは今年3位です。念のため、Kubernetesは、コンテナ化されたワークロードを実行および調整するためのプラットフォームです。
コンテナは、Linuxでプロセスを分離するための特別な構造として生まれました。コンテナは2007年からcgroupであり、名前付けは2002年からです。LXCが利用可能になった2008年までに、コンテナの形状はさらに良くなり、GoogleはBorgと呼ばれる独自の内部メカニズムを開発しました。ここで、「すべての作業はコンテナで行われます」。ここから、Dockerの最初のリリースが行われた2013年に早送りし、コンテナはついに人気のあるマスソリューションのカテゴリに移行しました。当時、Mesosはあまり人気がありませんでしたが、コンテナを調整するための主要なツールでした。 Kubernetesの最初のリリースは2015年に行われ、その後、このツールはコンテナオーケストレーションの分野で事実上の標準になりました。
Kubernetesがなぜそれほど人気があるのかを理解するために、いくつかの質問に答えてみましょう。開発者がアプリケーションを本番環境にデプロイする方法について最後に合意できたのはいつですか。箱から出して提供されるツールを使用している開発者を何人知っていますか?今日、アプリケーションの仕組みを理解していないクラウド管理者は何人いますか?この記事では、これらの質問に対する回答を検討します。
YAMLとしてのインフラストラクチャ
Puppet and ChefからKubernetesに移行した世界で、最大の変化の1つは、コードとしてのインフラストラクチャからデータとしてのインフラストラクチャへの移行です。特にYAMLのように。ポッド、構成、デプロイされたインスタンス、ボリュームなどを含むKubernetesのすべてのリソースは、YAMLファイルで簡単に記述できます。例えば:
apiVersion: v1
kind: Pod
metadata:
name: site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
このビューにより、DevOpsまたはSREは、PythonやJavascriptなどの言語でコードを記述しなくても、ワークロードを完全に表現することが容易になります。
特に、インフラストラクチャをデータとして編成することのその他の利点は次のとおりです。
- GitOps Git Operations Version. YAML- Kubernetes git, , , , . , , , , . , Kubernetes – pull-.
- . YAML, Kubernetes, . Kubernetes , , , , . , , - , maxReplicas 10 20:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
minReplicas: 1
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- . YAML , Kubernetes. , , , , - , . conftest, YAML/JSON, Open Policy Agent, , , SecurityContext . , rego, :
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
- . – . cloud-provider Kubernetes , . , Kubernetes AWS ,
LoadBalancer, Amazon Elastic Load Balancer, .
Kubernetesは非常に拡張性が高く、開発者はそれを気に入っています。ポッド、スイープ、
StatefulSetsシークレットなど、利用可能なリソースのコレクションがありますConfigMaps。ただし、ユーザーと開発者は、カスタムリソース定義の形式で他のリソースを追加できます。
たとえば、リソースを定義する場合は、次のようにする
CronTabことができます。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.my.org
spec:
group: my.org
versions:
- name: v1
served: true
storage: true
Schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
後で、次のようなCronTabリソースを作成できます。
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Kubernetesの拡張性に関する別のオプションは、開発者が独自の演算子を作成できることです。オペレーターは、「制御ループ」パターンで動作するKubernetesクラスター内の特別なプロセスです。オペレーターの助けを借りて、ユーザーはKubernetes APIと情報を交換することにより、CRD(カスタムリソース定義)の管理を自動化できます。
コミュニティには、開発者が独自のオペレーターを簡単に作成できるようにするツールがいくつかあります。その中には、OperatorFrameworkとそのOperatorSDKがあります。このSDKは、開発者がステートメントの作成を非常に迅速に開始できるフレームワークを提供します。コマンドラインから次のように開始できるとしましょう。
$ operator-sdk new my-operator --repo github.com/myuser/my-operator
これにより、YAMLファイルやGolangコードなど、オペレーターのすべてのステレオタイプ化されたコードが作成されます。
.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.go
次に、次のように、必要なAPIとコントローラーを追加できます。
$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService
$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService
次に、最後に、オペレーターを収集して、コンテナーのレジストリに送信します。
$ operator-sdk build your.container.registry/youruser/myapp-operator
開発者がさらに詳細な制御を必要とする場合は、ファイル内のステレオタイプ化されたコードをGoに変更できます。たとえば、コントローラの詳細を変更するには、ファイルに変更を加えることができます
controller.go。
別のプロジェクトであるKUDOでは、宣言型YAMLファイルのみを使用してステートメントを作成できます。たとえば、ApacheKafkaの演算子は次のように定義されます。これを使用すると、いくつかのコマンドを使用して、Kubernetesの上にKafkaクラスターをインストールできます。
$ kubectl kudo install zookeeper
$ kubectl kudo install kafka
次に、別のコマンドで構成します。
$ kubectl kudo install kafka --instance=my-kafka-name \
-p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 \
-p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m \
-p BROKER_COUNT=5 -p BROKER_MEM=4096m \
-p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 \
-p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20
革新
過去数年間、Kubernetesのメジャーリリースは数か月ごとにリリースされています。つまり、1年に3〜4回のメジャーリリースです。それぞれに実装されている新機能の数は減りません。さらに、私たちの困難な時期でも減速の兆候はありません-GithubでのKubernetesプロジェクトの現在の活動を見てください。
新機能により、さまざまなワークロードにわたって操作をより柔軟にクラスター化できます。さらに、プログラマーは、アプリケーションを本番環境に直接デプロイする際の制御を強化することを好みます。
コミュニティ
Kubernetesの人気のもう1つの主要な側面は、そのコミュニティの強さです。 2015年、バージョン1.0に到達すると、KubernetesはCloud Native ComputingFoundationによって後援されました。プロジェクトの進展に伴い、Kubernetesのさまざまな分野に焦点を当て
たさまざまなSIG(Special Interest Groups)コミュニティもあります。これらのチームは、Kubernetesでの作業をより便利で便利にするために、常に新しい機能を追加しています。
Cloud Native Foundationは、この記事の執筆時点で世界最大のオープンソース会議であるCloudNativeCon / KubeConもホストしています。通常、年に3回開催され、Kubernetesとそのエコシステムを改善し、3か月ごとに表示される新機能を習得したい何千人もの専門家が集まります。
さらに、Cloud Native Foundationには技術監視委員会があり、SIGとともに、クラウドエコシステムに焦点を当てた財団の新規および既存のプロジェクトをレビューします。これらのプロジェクトのほとんどは、Kubernetesの強みを向上させるのに役立ちます。
最後に、Kubernetesは、人々がお互いを抱きしめるコミュニティ全体の意図的な努力なしには、そのような成功を収めることはできなかったと思いますが、同時に、新参者を喜んで受け入れます。
未来
開発者が将来対処しなければならない主な課題の1つは、コードが動作するインフラストラクチャではなく、コード自体の詳細に焦点を当てる能力です。今日の主要なものの1つであるサーバーレスアーキテクチャパラダイムが対応するのは、これらの傾向です。Kubernetesを使用して開発者からインフラストラクチャを抽象化するKnativeやOpenFaasなどの高度なフレームワークがすでに存在します。
この記事では、Kubernetesの現在の状態を大まかに見てきただけです。実際、これは氷山の一角にすぎません。Kubernetesユーザーは、他にも多くのリソース、機能、および構成を自由に使用できます。