kubeadmでAmazon Linux2にKubernetes1.17を入れる場合はこちら
kubeadmでAmazon Linux2にKubernetes1.16を入れる場合はこちら
kubeadmでAmazon Linux2にKubernetes1.15を入れる場合はこちら
Master Node
EC2 | OS | Kubernetes | Docker | ホスト名 |
---|---|---|---|---|
t3.small | Amazon Linux2 | 1.18.0 | 19.03.6-ce | k8s-master |
2CPU、メモリ2GB以下の場合、kubeadm init実行時にエラーになります。
ディスクサイズはデフォルトの8G
Master NodeとWorker Nodeは同じVPC
Master NodeのIPアドレスは172.31.31.214
Worker Node
EC2 | OS | Kubernetes | Docker | ホスト名 |
---|---|---|---|---|
t3.small | Amazon Linux2 | 1.18.0 | 19.03.6-ce | k8s-worker |
ディスクサイズは8G
Master NodeとWorker Nodeは同じVPC
Worker NodeのIPアドレスは172.31.31.203
SELinux設定確認
getenforce
# 無効になっている
Disabled
ホスト名の設定
sudo hostnamectl set-hostname k8s-master
hostファイル編集
sudo vi /etc/hosts
以下の設定を追加
172.31.31.214 k8s-master
172.31.31.203 k8s-worker
swap確認
free
# ないので何もしない。ある場合は「swapoff -a」
total used free shared buff/cache available
Mem: 2002032 71720 1567924 384 362388 1786060
Swap: 0 0 0
Dockerインストール・設定
sudo yum install -y docker
# dockerサービス起動 / 自動起動有効化
sudo systemctl start docker && sudo systemctl enable docker
sudo docker info | grep -i version
# 実行結果
Server Version: 19.03.6-ce
containerd version: ff48f57fc83a8c44cf4ad5d672424a98ba37ded6
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Kernel Version: 4.14.171-136.231.amzn2.x86_64
# ログインしているユーザーをdockerグループに追加
sudo usermod -a -G docker $USER
# 確認コマンド
cat /etc/group | grep docker
# 実行結果
docker:x:993:ec2-user
# ログアウトして、すぐに再ログイン
exit
# cgroupdriverをsystemdに設定など
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
# 設定確認
docker info | grep -i driver
# 実行結果
Storage Driver: overlay2
Logging Driver: json-file
Cgroup Driver: systemd
その他の設定
# sysctlでネットワークをブリッジできるようする
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# カーネルパラメータを手動で反映
sudo sysctl --system
kubelet、kubeadm、kubectlインストール
「repo_gpgcheck=1」は「repo_gpgcheck=0」にする
Got "repomd.xml signature could not be verified for kubernetes" error when installing Kubernetes from yum repo on Amazon Linux 2 #60134
sudo sh -c "cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
"
sudo yum install -y kubelet-1.18.0-0.x86_64 kubeadm-1.18.0-0.x86_64 kubectl-1.18.0-0.x86_64 --disableexcludes=kubernetes
kubelet 起動
sudo systemctl enable kubelet && sudo systemctl start kubelet
Master の初期化
# WARNING でるのでtcインストール
# [preflight] Running pre-flight checks
# [WARNING FileExisting-tc]: tc not found in system path
sudo yum install -y tc
# Calicoを使うので「--pod-network-cidr 192.168.0.0/16」を指定
sudo kubeadm init --pod-network-cidr 192.168.0.0/16
トークンには有効期限があり、通常は24時間で利用できなくなる。
トークンが失効した場合や分からなくなった場合、マスターノードで「kubeadm token create --print-join-command」コマンドを実行するとトークンが再生成されて表示される。
kubectl 接続設定
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get cs
# 実行結果
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
kubectl get pod -A
# 実行結果
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-9v26n 0/1 Pending 0 102s
kube-system coredns-66bff467f8-tf8vz 0/1 Pending 0 102s
kube-system etcd-k8s-master 1/1 Running 0 118s
kube-system kube-apiserver-k8s-master 1/1 Running 0 118s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 118s
kube-system kube-proxy-w764p 1/1 Running 0 102s
kube-system kube-scheduler-k8s-master 1/1 Running 0 118s
Calico
kubectl apply -f https://docs.projectcalico.org/v3.13/manifests/calico.yaml
kubectl get pod -A
# 実行結果
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-5b8b769fcd-b5w75 1/1 Running 0 40s
kube-system calico-node-7x8x8 1/1 Running 0 40s
kube-system coredns-66bff467f8-9v26n 1/1 Running 0 2m53s
kube-system coredns-66bff467f8-tf8vz 1/1 Running 0 2m53s
kube-system etcd-k8s-master 1/1 Running 0 3m9s
kube-system kube-apiserver-k8s-master 1/1 Running 0 3m9s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 3m9s
kube-system kube-proxy-w764p 1/1 Running 0 2m53s
kube-system kube-scheduler-k8s-master 1/1 Running 0 3m9s
kubectl get node
# 実行結果
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3m53s v1.18.0
Worker Node
以下はMaster Nodeの手順を参照
SELinux設定確認
ホスト名の設定・・・sudo hostnamectl set-hostname k8s-worker
hostファイル編集
swap確認
Dockerインストール・設定
その他設定
kubelet、kubeadm、kubectlインストール
kubelet 起動
クラスタに参加
# WARNING でるのでtcインストール
sudo yum install -y tc
# 「kubeadm token create --print-join-command」はMaster Nodeで実行
kubeadm token create --print-join-command
# 長いので「・・・」で省略
sudo kubeadm join マスターノードのIPアドレス:6443 --token ・・・
トークンには有効期限があり、通常は24時間で利用できなくなる。
トークンが失効した場合や分からなくなった場合、マスターノードで「kubeadm token create --print-join-command」コマンドを実行するとトークンが再生成されて表示される。
Master Node
kubectl コマンドで Node と Pod の状態を確認
kubectl get node
# 実行結果
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 32m v1.18.0
k8s-worker Ready <none> 21s v1.18.0
Redisデプロイ・動作確認
vi redis.yaml
apiVersion: v1
kind: Service
metadata:
name: redis-svc
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
clusterIP: None
---
apiVersion: v1
kind: ConfigMap
metadata:
name: redis.config
data:
redis.conf: |
requirepass password
bind 0.0.0.0
---
apiVersion: apps/v1
kind: Deployment
metadata:
# Deploymentの名前。Namespace内ではユニークである必要があります
name: redis
spec:
selector:
matchLabels:
app: redis
# レプリカ数の指定
replicas: 1
# Podのテンプレート(PodTemplate)
template:
metadata:
labels:
# ラベル指定は必須
app: redis
spec:
containers:
- name: redis
image: redis:5.0.8
command:
- "redis-server"
- "/redis-master/redis.conf"
ports:
- name: redis
containerPort: 6379
volumeMounts:
- name: data
mountPath: /redis-master-data
- name: config
mountPath: /redis-master
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: redis.config
kubectl apply -f redis.yaml
kubectl run -it redis-cli --rm --image redis:5.0.8 --restart=Never -- bash
If you don't see a command prompt, try pressing enter.
root@redis-cli:/data# redis-cli -c -h redis-svc -p 6379 -a password
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
redis-svc:6379> set a 1
OK
redis-svc:6379> get a
"1"
redis-svc:6379> exit
root@redis-cli:/data# exit
Master 以外のノードに Role 設定
kubectl label node k8s-worker node-role.kubernetes.io/worker=
kubectl get node
# 実行結果
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 35m v1.18.0
k8s-worker Ready worker 3m51s v1.18.0