Kubernetes
技術者認定

Kubernetes技術者認定
技術解説セミナー
2023/10/8 開催
鯨井貴博
株式会社ゼウス・エンタープライズ
LinuCエヴァンジェリスト

講師紹介
n 鯨井貴博(くじらいたかひろ)
LPI-Japanプラチナスポンサー 株式会社ゼウス・エンタープライズ
⼤学時代 Unixの存在を知り、⽇経Linuxを読み始める。
2000年にVine Linux 2.0で⼀度挫折を経験。
その悔しさを忘れきれず、2007年 他業種からIT業界に転職しLinuxに再チャレンジ。
SE・商⽤製品サポート・インストラクター・プロジェクト管理などを経験し、現在に⾄る。
⾃分⾃⾝が学習で苦労した経験から、初⼼者を含む受講者に分りやすい講義を⾏うように⼼がけている。
また、興味の向くIT技術・オープンソースソフトウェアなどについて、Opensourcetehブログ（https://www.opensourcetech.tokyo/）で執筆中。
実際に⾃分でやってみる/使ってみる・開発者本⼈から話を聞いてみることを⼤切にしています。
2018年頃にDockerの延⻑で触り始めたのが、kubernetesを使うきっかけ。

2kubernetesへの道
n 私の場合Kubernetes

⼈⼯知能

クラウド基盤2023

ネットワーク全般

Web

サーバ

2007
3

認定のご紹介

nKubernetes技術者認定とはKubernetesの管理・運⽤やKubernetes⽤のアプリケーションを開発・構築することができるスキルの証明です。LPI-JapanはAuthorized Certification Partner
として、「CKA」「CKAD」「CKS」に加えて、クラウドネイティブの概念や基礎が学べる「KCNA」の４つの試験と、それぞれのトレーニング教材を提供しています。
CKA

基本的なインストールのほかにKubernetesクラスタを構成および管理するスキルを備えていること証明します。

CKAD

Kubernetes⽤のクラウドネイティブアプリケーションを設計、構築、公開できるスキルを備えていること証明します。

KCNA

Kubernetesとクラウドネイティブエコシステムの基本知識があることを証明します。

CKS

コンテナベースのアプケーションやKubernetesプラットフォームの環境などのセキュリティを確保できるスキルの証明。
4

解説のポイント(本⽇のアジェンダ)・コンテナとは・kubernetesとは・kubernetesの基礎を理解する
・Appendix

今⽇のゴール・kubernetesやコンテナの概要を理解することができる

5

我々は何を理解しておくべきか「コンテナ便利らしいよ」というのは何となくわかっているが、、、、・コンテナって何︖
・kubernetersって何、その仕組みは︖
・既存のサーバや物理マシンとの違いは︖
・どういう場⾯に適しているの︖など、技術者として理解し選択肢として持っておくことが求められている︕︕︕︕︕︕︕

6コンテナとは7ざっくりコンテナ史
1979年 chroot(Change Root)
2000年 FreeBSD Jail2004年 Solaris Zone
2006年 cgroups(Linuxカーネルの機能)
2008年 namespaces (Linuxカーネルの機能)
LXC(LinuX Containers)
2013年 Docker
2014年 Kubernetes

Linux/OSSの成長・活性化
×
既存インフラ(NW・サーバなど)の限界↓
本格的なコンテナ利用！
8

コンテナの特徴(物理マシン・仮想マシンとの⽐較)
n 軽量であるn 起動が⾼速(早ければ数秒)
n 移植性に優れる

仕組みは違えど、いずれもOS/プログラム/NW/セキュリティ(アクセス制限)などは共通した機能を持っていることを認識することが重要︕

https://kubernetes.io/ja/docs/concepts/overview/
9

コンテナの特徴
n 軽量である ⇒ホストOSのLinuxカーネルを共有するためn 起動が⾼速(早ければ数秒) ⇒軽量であるため
n 移植性に優れる ⇒コンテナ基盤(Docker・kubernetesなど)さえあれば起動可能

コンテナの元となるデータ自体が小さいサイズである

https://hub.docker.com/_/nginx/tags

10

コンテナが解決する課題
n DevOps(開発・運⽤)との相性がいい

deOps
(運⽤)

Dev
(開発)

bu
ild

名前空間
production

tera

名前空間
develop

an

oylpe
oped
copls
tetfe

ed

ba
ckmr
toion

従来だと、検証環境と商用環境の差分からリリース失敗となったり、開発担当と運用担当との間に溝が出来ることも多かった。。。
11

コンテナ(kubernetes)が解決する課題
n 検証環境と商⽤環境で全く同じデータ(コンテナイメージ)を使うことができる
移植性と名前空間(Namespace)の恩恵
https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
kubeuser@master01:~$ kubectl get namespaces
NAME
STATUS AGE
production
Active 111d ・・・商⽤環境
develop
Active 113d
・・・検証環境
cadvisor
Active 69ddefault
Active 129dingress-nginx
Active 127d
kube-node-lease
Active 129d
kube-public
Active 129d
kube-system
Active 129d
kubernetes-dashboard Active 116d
metallb-system
Active 128d

12

コンテナ(kubernetes)が解決する課題
n オートスケーリング⇒ユーザアクセスの増減によって、コンテナ(アプリケーション)を⾃動で増減させる
n オートヒーリング⇒コンテナ(アプリケーション)異常終了時などに、⾃動復旧させる
n yamlファイルなどで宣⾔をするため、アプリケーション開発者にも優しいkubeuser@master01:~$ cat pods.yaml
apiVersion: v1
kind: Pod
metadata:labels:run: test-webserver
name: test-webserver
spec:
containers:- image: nginx:latest
name: test-webserver
resources:
limits:cpu: 100m
requests:
cpu: 50m

13

Kubernetesとはkubernetesの基礎を理解する14

kubernetesの歴史
n ベースにあるのは、Google社内で使われていたコンテナクラスタマネージャ「Borg」
n 2014年6⽉にオープンソースで公開
n 2015年7⽉にバージョン1.0となり、Linux Foundation傘下の組織である
CNCF(Cloud Native Computing Foundation)に移管

https://kubernetes.io/releases/

15

kubernetesの種類(distribution)n Red Hat OpenShift
Red Hat社製Kubernetes

Linuxディストリビューションに種類が多いように、kubernetesも様々な種類がある︕

https://www.redhat.com/ja/technologies/cloud-computing/openshiftn Tanzu Kubernetes Grid
VMware社製kubernetes
https://tanzu.vmware.com/jp/kubernetes-gridn Rancher
SUSE社製Kubernetes
https://www.rancher.com/

16

kubernetesの種類(distribution)n クラウドサービス(AKS、EKS、GCPなど)

Kubernetes Cluster(基盤)の管理が不要

AKS(Azure Kubernetes Service)https://azure.microsoft.com/ja-jp/products/kubernetes-service

EKS(Amazon Elastic Kubernetes Service)https://aws.amazon.com/jp/eks/

GKE(Google Kubernetes Engine)
https://cloud.google.com/kubernetes-engine?hl=ja

17

kubernetesの種類(distribution)n 実際に使ってみた初めてのAKS(Azure Kubernetes Service) on Microsoft Azure
https://www.opensourcetech.tokyo/entry/20221223/1671721620

18

kubernetesのインストール⽅法
n kubeadm
拡張性のあるkubernetes構成を構成
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

n kind“kubernetes in docker”の略で、Docker上にkubernetesを構成
https://kind.sigs.k8s.io/docs/user/quick-start/n minikube
PC上にVMとしてkubernetes(シングルノード)を構成
https://kubernetes.io/ja/docs/setup/learning-environment/minikube/

19

kubernetesのインストール/アップグレード⽅法
kubenetesクラスター(v1.22.0)の構築(kubeadm) on Ubuntu Server 20.04.3 LTS
https://www.opensourcetech.tokyo/entry/20220215/1644853476

DualStack(IPv4 & IPv6)のkubernetesクラスター構築(v1.26.00・ubuntu22.04)
https://www.opensourcetech.tokyo/entry/20230314/1678782139

KubernetesクラスターのUpgrade(1.26 to 1.27)
https://www.opensourcetech.tokyo/entry/20230513/1683966484

20

kubernetesのcluster構成
n Masterノード︓クラスター全体の管理する役割
n Workerノード︓コンテナ(Pod)が稼働する環境

検証⽤など最⼩構成としたい場合、両⽅の役割を1台のマシンで兼⽤可能※当然だが、冗⻑性なしControl Plane①コンテナ起動を指示②コンテナが配置

21

kubernetesのcluster構成
Controller manager
各種リソース制御

Cloud controller manager
クラウド連携API server
apiを提供・構成全体のハブ
etcd
構成情報格納Workerノード

Masterノード

Scheduler
Podなどをどこに配置するか

kubeletControl Planeとの連携

https://kubernetes.io/docs/concepts/overview/components/ 22

kubernetesにおけるリソースの定義(yamlファイルの書き⽅)
n yamlという⽅法で表記する
kubeuser@master01:~$ cat pods.yaml
apiVersion: v1
kind: Pod
metadata:labels:run: test-webserver
name: test-webserver
spec:
containers:- image: nginx:latest
name: test-webserver
resources:
limits:cpu: 100m
memory: 5Mirequests:
cpu: 50m
memory: 3Mi

yamlに対応したEditorやツールを使うと便利♪

APIバージョンとリソース(kind)の指定コンテナに付与するラベル

使用するコンテナイメージの指定と名前

Pod(コンテナ)に割り当てるリソース指定

23覚えておくとよいコマンドの使い⽅(kubectl)
n チートシートhttps://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/24kubernetesのリソースとその機能
n Pod(コンテナ、最⼩の単位)
n ReplicaSet(コンテナを冗⻑化など)
n Deployment(コンテナの⾃動復旧・⾃動増減などの機能を付与)
n ConfigMap(設定ファイルや変数などを定義)
n Volume(コンテナのデータ保存場所)
n Secret(パスワードなど秘匿性の⾼いデータを定義)
n Service(コンテナを外部に公開する)
n Ingeress(L7ロードバランサー機能)
n NetworkPolicy(ACLのようなもの通信制限)
n DaemonSet(コンテナを各ノードに1台ずつ配置する機能)n Job(⼀度だけ処理を実⾏するためのコンテナ)n CronJob(定期的に処理を実⾏するためのコンテナ)n Role/ClusterRole(権限)この中から必要なものを組み合わせて使う︕など
25

Pod
n コンテナの実態 ≒ アプリケーション※いずれかのノード上で起動される

n コンテナの起動
kubectl run nginx --image=nginx
n コンテナの⼀覧表⽰
kubectl get podn コンテナのひな形(yamlファイル)作成
kubectl run nginx --image=nginx --dry-run=client -o yaml > pod.yamln コンテナの起動(yamlファイルから)kubectl apply –f pod.yaml※Podネットワーク⽤(内部)のIPアドレスが付与されているので、外部公開設定(Service)を使わないと外部と通信が出来ない※リソースが枯渇しないように制限(limits/requests)を制限しておく26

Podn Static Pod
指定したノードでPodを起動させるkubelet.confに設定ファイル(yamlファイル)を配置するパスが書いてある
staticPodPath: /etc/kubernetes/manifests
kubeuser@master01:~$ ls /etc/kubernetes/manifests/
etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml webserver.yaml
kubeuser@master01:~$ kubectl get pods
NAME
READY STATUS RESTARTS
AGE
nginx-6cbc9bb4f5-jm8mr
1/1
Running 0
120d
nginx-6cbc9bb4f5-pfhfz
1/1
Running 0
121d
nginx2-f96cfc57b-vnsfm
1/1
Running 0
121d
test-webserver
1/1
Running 2 (69d ago) 105d
webserver-master01
1/1
Running 071d

kubernetesでstatic podを起動させる

https://www.opensourcetech.tokyo/entry/20230327/1679909358

27

ReplicaSet/Deploymentn Podに、⾃動復旧機能やアップデートなどの機能を付与するもの
n ⾃動復旧の例
kubeuser@master01:~/autoscaling$ kubectl get pods -w
NAME
READY STATUS RESTARTS AGE
hpa-nginx-668b69fd79-9qqpb 1/1
Running 04m9s
hpa-nginx-668b69fd79-k7d2q 1/1
Running 04m9s
hpa-nginx-668b69fd79-pzxdl 1/1
Running 04m9s
hpa-nginx-668b69fd79-v5bjk 1/1
Running 04m9s

コンテナの強制削除

kubeuser@master01:~/autoscaling$ kubectl delete pods hpa-nginx-668b69fd79-9qqpb --force
hpa-nginx-668b69fd79-9qqpb 1/1
hpa-nginx-668b69fd79-xnqfx 0/1
hpa-nginx-668b69fd79-xnqfx 0/1
hpa-nginx-668b69fd79-xnqfx 1/1

Terminating 04m45s
Pending
00s
ContainerCreating 01s
Running
08s

不足となった1台を自動復旧

28

ReplicaSet/Deployment(Autoscaling)n オートスケーリングの例
kubeuser@master01:~/autoscaling$ cat hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpa-nginx
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
負荷状況によって、
name: hpa-nginx
最小1台～最大10台の間で自動変動する
minReplicas: 1maxReplicas: 10
metrics:- type: Resource
resource:
Pod(コンテナ)のCPU使用率が50%を超過
name: cpu
⇒増設
target:type: Utilization
averageUtilization: 50

29

Deployment
Deploymentの耐障害性(⾃動復旧)とオートスケーリング(kubernetes)
https://www.opensourcetech.tokyo/entry/20230405/1680698675

kubernetesにおけるPodへの負荷分散状況の確認(Service/Deployment経由)
https://www.opensourcetech.tokyo/entry/20230326/1679837870

30

ConfigMap/Secret/ストレージ領域
n ConfigMap︓サーバ設定ファイルなどをPodへ渡す⼿段
nginxコンテナ(Pod)のコンテンツ(index.html)をConfigMapで提供・更新する(kubernetes)
https://www.opensourcetech.tokyo/entry/20230319/1679224123

n Secret
パスワードなど機密情報をPodへ渡す⼿段
n ストレージ領域(volume)
Podにストレージ領域(データ保存場所)を提供する⽅法
hostPath︓ノード上の指定パスにデータ保存
PersistentVolume(永続的な領域)/PersistentVolumeClaim(領域要求)※NFSやクラウドストレージをデータ保存先として利⽤

31

Servicen Podなどのリソースを外部からアクセスできるようにするもの(ルーティング処理)

kubernetes内のリソースを外部へ公開

MetalLBとService(type:LoadBalancer)による外部クライアントへのサービス公開(kubernetes v1.26.00 on ubuntu22.04)
https://www.opensourcetech.tokyo/entry/20230316/1678966960

32

Servicen Serviceの種類
NodePort︓
kubernetesクラスターを構成するノードが持つIPアドレスの特定ポート(デフォルト設定だと、30000-32767)を外部公開する
LoadBalancer︓
連携するLBから払い出された外部からのアクセスが可能なIPアドレスの指定ポートを公開する
ClusterIP︓
kubernetesクラスター内部のPodなどからアクセスする33

Ingressn 外部からのアクセスをパスに基づいて振り分ける機能(L7ロードバランサ)
clientから指定されたパス(/food、/movie)に基づき、どのリソースに振り分ければいいか判断している

https://kubernetes.io/docs/concepts/services-networking/ingress/

34

Ingress
kubeuser@master01:~$ cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-localhost
namespace: default
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /spec:
ingressClassName: nginx
rules:- http:paths:- backend:service:
name: service1
port:
number: 80
path: /red
pathType: Prefix- http:paths:- backend:
service:name: servicre2
port:
number: 80
path: /blue
pathType: Prefix/blueというパスが指定された場合、“service2”というServiceにアクセスを割り振る/redというパスが指定された場合、“service1”というServiceにアクセスを割り振る

NGINX Ingress Controller + Ingressによるサービス公開(kubernetes v1.26)
https://www.opensourcetech.tokyo/entry/20230317/1679054672

35

NetworkPolicyn クラスター内のPod間のアクセス制御するルール

Network Policyによるトラフィック制御(kubernetes)

https://www.opensourcetech.tokyo/entry/20230331/1680263776

36

NetworkPolicy
kubeuser@master01:~/networkpolicy$ cat np-all-deny.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:①全てのPod間通信をname: all-deny
拒否するルール
namespace: blue
spec:
podSelector: {}egress:- {}policyTypes:- Ingress- Egress--apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: all-denynamespace: orange
spec:
podSelector: {}egress:- {}policyTypes:- Ingress- Egress

kubeuser@master01:~/networkpolicy$ cat np-allow.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy②一部のPod間通信をmetadata:
許可するルール
name: orange2-from-blue1
namespace: orange
spec:
podSelector:
matchLabels:
web: orange2 ・・・Network Policyの対象となるPodのラベル
policyTypes:- Ingress ・・・制御するトラフィックの⽅向
ingress:- from: ・・・トラフィックの送信元情報- ipBlock: ・・・・IPアドレス+プレフィックスを使った送信元の制御
cidr: 10.0.30.116/32- namespaceSelector: ・・・名前空間を使った送信元の制御
matchLabels:
name: blue
- podSelector:
matchLabels:
web: blue1 ・・・Podのラベルを使った送信元の制御
ports: ・・・Network Policyの対象となるPodの受信ポート & プロトコル- protocol: TCP
port: 8037

Appendix38

デモ・Namespaceの作成
・Pod(Deployment)の作成 ※Webサーバ
・ConfigMapの作成 ※コンテンツファイルの編集(index.html)
・サービス公開(Service作成)

39

便利なツール
n パケットキャプチャ(ksniff)kubernetesのPod(コンテナ)のパケットキャプチャを取得する⽅法
https://www.opensourcetech.tokyo/entry/20230608/1686209551

n sternsternを使った複数Podのログ出⼒(kubernetes)
https://www.opensourcetech.tokyo/entry/20230425/1682427182

40

管理ツールn dashboard
kubernetes dashboardを使う
https://www.opensourcetech.tokyo/entry/20230329/1680093328

n LENS
LENS(開発統合環境)でkubernetesクラスターを操作する
https://www.opensourcetech.tokyo/entry/20211216/1639659801

n NewRelic
https://newrelic.com/jp

41

その他
n Kubernetesのベータ機能・アルファ機能を使ってみる
Feature Gates

https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/

Kubernetes 1.27の新機能(Feature Gate)を有効化し、InPlacePodVerticalScalingを試してみる
https://www.opensourcetech.tokyo/entry/20230514/1684069660
42おすすめ書籍
n Kubernetes完全ガイド 第2版
n イラストでわかるDockerとKubernetes
n Kubernetesの知識地図

まず、これを⼊⼿︕

イラストで理解を深める

Kubernetesを深堀する
43

ゼウス・エンタープライズからのお知らせ
n Kubernetes研修(LFS458-JP)やってます︕※講師主導型CKA(Certified Kubernetes Administrator)対策コース

ご興味のある方はこちらからhttps://www.it-training.tokyo/kubernetes/

44

Open Source Summit Japan 2023

イベント運営を⼀緒にやってみませんか︖

ボランティアスタッフって、何やるの？

https://events.linuxfoundation.org/open-source-summit-japan/

応募はこちらから♪
https://docs.google.com/forms/d/e/1FAIpQLScBZbA253_dwA5PNEidpc8hKEFWODM37vNcvhebKGLoaCOJ3g/viewform?usp=sharing
45

今後のKubernetes技術セミナーで取り上げてほしいテーマなどあればこのあと案内するアンケートに記載いただけると⼤変うれしいです︕

46

ご清聴ありがとうございました♪

47