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
Login ไปยังเครื่อง Deployer
เตรียมเครื่องให้ Deployer สามารถ access ไปยัง K8S node ได้ โดยไม่ต้องอาศัย password
สร้าง key ที่ deployer
ssh-keygen -t rsa -b 2048 -f /home/nc-user/.ssh/id_rsa -N ""
add key ไปยัง K8S node
ssh-copy-id [email protected] ssh-copy-id [email protected] ssh-copy-id [email protected]
ตรวจสอบให้แน่ใจว่า user ที่แต่ละ node สามารถ sudo เป็น root ได้
Installation Step
Login ไปยังเครื่อง Deployer
Install pip3 & virtualenv
sudo apt update sudo apt upgrade sudo apt install -y python3-pip sudo apt install -y python3-venv
Install Kubespray
Clone Kubespray จาก git
git clone https://github.com/kubernetes-sigs/kubespray.git
เข้าไปยัง directory kubespray และ copy sample มาสร้าง config ของตนเอง
cd kubespray cp -rfp inventory/sample inventory/mycluster
create & activate virtualenv
python3 -m venv virtualenv source /home/nc-user/virtualenv/bin/activate
install requirement
pip3 install setuptools pip3 install -r requirements.txt
แก้ไข inventory.ini
vi inventory/mycluster/inventory.ini
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
setup kubespray ด้วย ansible-playbook
cd /home/nc-user/kubespray ansible-playbook -i inventory/mycluster/inventory.ini --user nc-user --become --become-user=root cluster.yml
Install helm
ไปที่เครื่อง master node (K8S node1)
download script และ install
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > install-helm.sh bash install-helm.sh
setup tiller & set ClusterRoleBinding
สร้างไฟล์ชื่อ tiller.yml ด้วย content ดังนี้
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: ""
kubectl create -f tiller.yml helm init --service-account tiller --upgrade
Install Nginx Ingress Controller
Login ไปยังเครื่อง master node (K8S node1)
Install nginx ingress controller ด้วย helm
helm install --name my-nginx stable/nginx-ingress --set controller.service.type=NodePort --set controller.publishService.enabled=true
เช็ค service port ที่เปิดจาก Ingress controller
kubectl get svc |grep ingress-controller my-nginx-nginx-ingress-controller NodePort 10.233.27.234 <none> 80:32393/TCP,443:31765/TCP 75m
Install & Setup Load Balancer
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
Install & Setup 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
Test Solutions
สร้าง deployment สำหรับทดสอบ ชื่อ hello-kubernetes-first.yaml
และ ingress ชื่อ hello-kubernetes-ingress.yaml
apiVersion: v1 kind: Service metadata: name: hello-kubernetes-first spec: type: ClusterIP ports: - port: 80 targetPort: 8080 selector: app: hello-kubernetes-first --- apiVersion: apps/v1 kind: Deployment metadata: name: hello-kubernetes-first spec: replicas: 1 selector: matchLabels: app: hello-kubernetes-first template: metadata: labels: app: hello-kubernetes-first spec: containers: - name: hello-kubernetes image: paulbouwer/hello-kubernetes:1.5 ports: - containerPort: 8080 env: - name: MESSAGE value: Hello from the first deployment!
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: hello-kubernetes-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - http: paths: - backend: serviceName: hello-kubernetes-first servicePort: 80
kubectl create -f hello-kubernetes-first.yaml kubectl create -f hello-kubernetes-ingress.yaml
ทดสอบเข้าจาก PC ด้วย ip ของ Load Balancer