AWSのLightsailに毎月2000円ぐらいの仮想マシンを建てて、シングルノードKubernetesクラスターを作る話。
OSのコンソールに直接アクセスしてdockerコマンドとかを実行できるので開発環境には都合が良い。今回の個人的な用途はOperator SDKでの開発用。
記事作成時点のKubernetesバージョンは1.17。OSは訳あって、と言うかOperator SDKと相性良さそうというか、でCentOS 7。
Lightsailに仮想マシンを作る
https://lightsail.aws.amazon.com/ls/webapp/home/instances
OSのみ。CentOS 7 1901-01。月額$20の、4GB Memory、2 vCPUのインスタンスを作成。
Lightsailコンソールを開く
インスタンスが出来たらコンソールを開き、何はともあれsudo -iを実行。
$ sudo -i
Dockerとか、前提パッケージのインストール
https://kubernetes.io/docs/setup/production-environment/container-runtimes/
コマンドをコピペするときは、改行文字がCRLFで転送されない様に注意。notepad++の改行モードをUnix(LF)にして、それに貼り付けてから改めてLightsailコンソールに貼るとかね。
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum update -y && yum install -y containerd.io-1.2.10 docker-ce-19.03.4 docker-ce-cli-19.03.4
# mkdir /etc/docker
# cat > /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
# mkdir -p /etc/systemd/system/docker.service.d
# systemctl daemon-reload
# systemctl restart docker
# systemctl enable docker
kubelet、kubeadmのインストール
# 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=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
# setenforce 0
# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# systemctl enable --now kubelet
# cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl --system
Kubernetesのインストール
ネットワーク・ドライバーはcalico。
# kubeadm init --pod-network-cidr=192.168.0.0/16
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl apply -f https://docs.projectcalico.org/v3.11/manifests/calico.yaml
CoreDNSが起動している事を確認
calicoインストール後、暫くするとCoreDNSが起動する。
[root@ip-172-26-4-124 ~]# kubectl get pod -n kube-system
NAME READY STATUS
RESTARTS AGE
calico-kube-controllers-5b644bc49c-wgfzv 1/1 Running
0 44s
calico-node-ktkgn 1/1 Running
0 45s
coredns-6955765f44-mgpjr 1/1 Running
0 2m52s
coredns-6955765f44-xszrk 1/1 Running
0 2m52s
etcd-ip-172-26-4-124.ap-northeast-1.compute.internal 1/1 Running
0 3m8s
kube-apiserver-ip-172-26-4-124.ap-northeast-1.compute.internal 1/1 Running
0 3m8s
kube-controller-manager-ip-172-26-4-124.ap-northeast-1.compute.internal 1/1 Running
0 3m7s
kube-proxy-qctwk 1/1 Running
0 2m52s
kube-scheduler-ip-172-26-4-124.ap-northeast-1.compute.internal 1/1 Running
0 3m8s
taint解除
シングルノードクラスターのためMasterノードでアプリが起動する必要があり、taintを解除。
# kubectl taint nodes --all node-role.kubernetes.io/master-
動作確認
とりあえずnginx動かしてみてアクセスできるか。
# kubectl run nginx --image=nginx
# kubectl expose deploy/nginx --type=NodePort --port=80
# kubectl get svc
(最後のコマンドの出力結果)
[root@ip-172-26-4-124 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 57m
nginx NodePort 10.96.212.196 <none> 80:30142/TCP 17m
手元のWebブラウザからアクセスするなら、NodePortで開いているポート番号(上の例なら30142)で仮想マシンにアクセスできるよう、Lightsailファイアウォールに許可するポートを追加。
で、「http://<インスタンスのIPアドレス>:<NodePort>」でWebブラウザからアクセスすれば以下の画面が表示される。
。。まあ、当初の目的がOperator SDK開発環境なので外部webアクセスは必要ないが。
Operator SDKのチュートリアルやってみましたを、気が向いたら日を改めて。