Requirement
สร้างเครื่อง 3 เครื่องสำหรับเป็น Kubernetes node
สร้างเครื่อง 1 เครื่อง สำหรับเป็น load balancer
สร้างเครื่อง 1 เครื่อง สำหรับเป็น NFS server
สร้างเครื่อง 1 เครื่อง สำหรับเป็น Deployer
Pre-install Step
config firewall ระดับ instance (cloud firewall) ดังนี้
Load Balancer เปิด http & https (80/tcp & 443/tcp) จาก world-wide
NFS server เปิด port สำหรับ nfsv4 (2049/tcp) จาก K8S node
K8S node เปิด In-cluster (allow ทุก connection ระหว่าง node ด้วยกันเอง) และ allow ทุก request จาก Load Balancer
Installation Step
Login ไปยังเครื่อง Deployer
เตรียมเครื่องให้ deployer สามารถ access ไปยัง node ได้โดยไม่ต้องใช้ password
สร้าง key ที่เครื่อง deployer
ssh-keygen
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ลง package pip3
sudo apt update
sudo apt upgrade
sudo apt install -y python3-pip
sudo apt install -y python3-venv
Clone Kubespray จาก git
git clone https://github.com/kubernetes-sigs/kubespray.git
สร้าง virtual environment เพื่อไม่ให้ lib python รบกวนกัน
python3 -m venv virtualenv
source /home/nc-user/virtualenv/bin/activate
เข้าไปยัง directory kubespray และ install requirement
cd kubespray
pip3 install setuptools
pip3 install -r requirements.txt
copy sample มาสร้าง config ของตนเอง
cp -rfp inventory/sample inventory/mycluster
แก้ไข inventory.ini
vi inventory/mycluster/inventory.ini
[all]
node1 ansible_host=10.148.0.11 ip=10.148.0.11
node2 ansible_host=10.148.0.12 ip=10.148.0.12
node3 ansible_host=10.148.0.13 ip=10.148.0.13[kube-master]
node1
node2
node3[etcd]
node1
node2
node3[kube-node]
node1
node2
node3[calico-rr]
[k8s-cluster:children]
kube-master
kube-node
calico-rr
ใช้ command ansible ในการ setup kubespray
cd /home/nc-user/kubespray
ansible-playbook -i inventory/mycluster/inventory.ini –user nc-user –become –become-user=root cluster.yml
ไปที่เครื่อง master-node1
download and run script ใน การ install helm
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > install-helm.sh
bash install-helm.sh
สร้าง file tiller.yml สำหรับ ClusterRoleBindind เพื่อ map role ให้กับ triller
vi tiller.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system—
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: tiller-clusterrolebinding
subjects:
– kind: ServiceAccount
name: tiller
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: “”
สั่ง command kubectl เพื่อสร้าง ClusterRoleBindind
kubectl create -f tiller.yml
สั่ง command helm init เพื่อupgrade triller
helm init –service-account tiller –upgrade
สร้าง nginx-ingress สำหรับรับ traffic
git clone https://github.com/nginxinc/kubernetes-ingress/
git checkout v1.6.2
cd kubernetes-ingress/deployments
สร้าง namespace nginx-ingress และสร้าง service account สำหรับ nginx-ingress
kubectl apply -f common/ns-and-sa.yaml
สร้าง ClusterRoleBindind เพื่อ map role ให้กับ service account ของ nginx-ingress
kubectl apply -f rbac/rbac.yaml
สร้าง config map เพื่อ map file nginx.conf
kubectl apply -f common/nginx-config.yaml
สร้าง daemonset เพื่อรับ traffic ตรงจากเครื่อง host
kubectl apply -f daemon-set/nginx-ingress.yaml
สร้าง Load Balance
Login ไปยังเครื่อง Load Balancer
Install nginx
sudo apt update
sudo apt upgrade
sudo apt install -y nginx
config nginx ให้มายัง K8S cluster และ port ตาม Ingress
sudo vi /etc/nginx/sites-enabled/default
upstream k8s {
server 10.148.0.11:32393;
server 10.148.0.12:32393;
server 10.148.0.13:32393;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://k8s;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}sudo systemctl reload nginx
สร้าง NFS Server
Login ไปยังเครื่อง NFS server
sudo apt update
sudo apt upgrade
sudo apt install -y nfs-server
เตรียม disk ที่จะใช้เก็บ data และเตรียม path ให้พร้อม
config nfs export ให้เครื่องใน private subnet สามารถ access read-write ได้ และ restart service
sudo vi /etc/exports
/ exports 10.148.0.0/24 (rw,sync,no_subtree_check,no_root_squash)
sudo systemctl restart nfs-server
สร้าง deployment และ service สำหรับ run ทดสอบ
vi hello-kubernetes.yml
apiVersion: v1
kind: Service
metadata:
name: hello-kubernetes
namespace: dev
spec:
type: ClusterIP
ports:
– port: 80
targetPort: 8080
selector:
app: hello-kubernetes
—
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kubernetes
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: hello-kubernetes
template:
metadata:
labels:
app: hello-kubernetes
spec:
containers:
– name: hello-kubernetes
image: paulbouwer/hello-kubernetes:1.7
ports:
– containerPort: 8080
kubectl apply -f hello-kubernetes.yml
สร้าง ingress สำหรับ forword traffic ไปที่ deployment hello-kubernetes
vi hello-kubernetes-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-kubernetes-ingress
namespace: dev
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
– host: hello-kubernetes.com
http:
paths:
– backend:
serviceName: hello-kubernetes
servicePort: 80
kubectl apply -f hello-kubernetes-ingress.yaml
ทดสอบ โดยการ map host ที่เครื่อง
<external ip> hello-kubernetes.com