> For the complete documentation index, see [llms.txt](https://anida-huang.gitbook.io/cloud-communication/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://anida-huang.gitbook.io/cloud-communication/qi-mo/kubernetes-yi.md).

# 20201201 kubernetes (一)

## 課堂資料

{% embed url="<https://blog.tomy168.com/2019/08/centos-76-kubernetes.html>" %}

{% embed url="<https://kubernetes.io/docs/tutorials/kubernetes-basics/>" %}

### 安裝 Kubernetes

#### 所有機器安裝步驟

> 環境下加裝常用工具

```
yum install wget net-tools nano -y
```

{% tabs %}
{% tab title="vm1" %}
![](/files/-MNS4n2_y8Y2ljuiKzZi)
{% endtab %}

{% tab title="vm2" %}

{% endtab %}

{% tab title="vm3" %}

{% endtab %}
{% endtabs %}

> 為叢集設置主機名稱以便 nodes 間的相互溝通，XXX 分別對應自己的角色 Hostname

```
hostnamectl set-hostname XXX
```

```
vim /etc/hosts
```

{% tabs %}
{% tab title="vm1" %}
![](/files/-MOSSHLnDG66E6AP0fs2)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MOSSTBKufOcvKCtCp5X)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MOSSddVrnAl5fIEn7zP)
{% endtab %}
{% endtabs %}

> 禁用 Selinux 與 swap，
>
> kubernetes 基於性能理由建議關閉 swap、更改 fstab 檔案註解 swap 分區以避免重開機後再次作用

```
setenforce 0
```

```
sed -i 's@SELINUX=enforcing@SELINUX=disabled@' /etc/sysconfig/selinux
```

```
vim /etc/fstab
```

{% tabs %}
{% tab title="vm1" %}
![](/files/-MNS3uHASLsOkmSNYAa9)

> 註解swap只留下UUID

![](/files/-MNS3eJxEPseRbLCMy8s)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MNS5JGcHh_0gU2cDwHK)

![](/files/-MNS52sjLCzHPl_lUxli)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MNS6cfIkrg1e0m83lT4)

![](/files/-MNS6NgtDpZ9Nm0fKXJF)
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
註解 swap 後須重新開機並使用`free`檢查swap是否關閉
{% endhint %}

> ptables相關功能或模組的啟用與停用，後續kubernetes會接手管理這部分的網路功能

```
systemctl disable firewalld && systemctl stop firewalld
```

```
echo 1 > /proc/sys/net/ipv4/ip_forward
```

```
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
```

```
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
```

```
modprobe br_netfilter
```

```
echo "br_netfilter" > /etc/modules-load.d/br_netfilter.conf
```

```
sysctl -p
```

```
lsmod | grep br_netfilter
```

{% tabs %}
{% tab title="vm1" %}
![](/files/-MNS860Co4NnK0MtJ1Xf)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MNS8ILBZsKg7k2WKoBp)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MNS8v86FJddLabQLVV8)
{% endtab %}
{% endtabs %}

> 添加 docker-ce 與 kubernetes 的 yum 源、並重整 yum 倉庫

```
yum install -y yum-utils device-mapper-persistent-data lvm2
```

```
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```

```
vim /etc/yum.repos.d/kubernetes.repo
```

{% hint style="warning" %}
進入編輯後輸入以下文檔

```
[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
```

{% endhint %}

{% tabs %}
{% tab title="vm1" %}
![](/files/-MNSB94NFjac4r3gTsSJ)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MNSBqix8R27P0MtqPho)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MNSCn2jW8FK-SCsnLjm)
{% endtab %}
{% endtabs %}

```
yum clean all && yum repolist
```

{% tabs %}
{% tab title="vm1" %}
![](/files/-MNSE8vCGFzGxBVfeWhw)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MNSE_ReBPWmGhWhPYwZ)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MNSEutlACsdjNpZKG3J)
{% endtab %}
{% endtabs %}

> 安裝 docker-ce 與 kubernetes、指定套件的安裝版本並設置為開機啟動

```
yum install docker-ce-18.09.8 --nogpgcheck
```

```
systemctl enable docker && systemctl start docker
```

```
yum install kubelet-1.15.2 kubectl-1.15.2 kubeadm-1.15.2 --nogpgcheck --disableexcludes=kubernetes
```

```
systemctl enable kubelet.service
```

{% tabs %}
{% tab title="vm1" %}
![](/files/-MNSJ2aEvwJJTEE1RJXg)

![](/files/-MNSMLhe7CATWenVjujA)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MNSJdrYEpHfs7tJ5Zce)

![](/files/-MNSL5y3_KJAfXzkk-P7)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MNSKizD__TqQTf_GS2S)

![](/files/-MNSLGOdj40zgWnDeYk6)
{% endtab %}
{% endtabs %}

#### Master機器初始化：以vm1 為Master

> 初始化 master，api-server-advertise 指定為 master 的內部 IP，pod-network-cidr 與 service-cidr 都採預設值，也可以變更為其他

```
kubeadm init --apiserver-advertise-address=[ master IP ] --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=v1.15.2 --cri-socket="/var/run/dockershim.sock"
```

{% hint style="info" %}
紅字的前三行是在說明作為 master 角色還需手動輸入提示的指令，才能順利運作這個叢集，而最下方的kubeadm 範例則是提示 worker nodes 欲加入叢集所需輸入的指令

```
mkdir -p $HOME/.kube
```

```
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
```

```
chown $(id -u):$(id -g) $HOME/.kube/config
```

{% endhint %}

> &#x20;安裝通用的 flannel容器網路介面CNI（Container Network Interface）元件

```
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

{% hint style="danger" %}
Then you can join any number of worker nodes by running the following on each as root：

```
kubeadm join 192.168.8.129:6443 --token e09bz5.lwdqen1ezp4wif1a \
    --discovery-token-ca-cert-hash sha256:982152b77b1cd7e7104d8cc15527020238c9654832c34014540c4f581cab34d0 
```

將結果複製去 vm2、vm3
{% endhint %}

![](/files/-MOSNtYlYXuOr7OzePjH)

![](/files/-MOSOFU6U3mqPYKrD9B-)

{% tabs %}
{% tab title="vm2" %}
![](/files/-MOSPC63fJsm3QeFb6yu)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MOSPHqQDUoG0HcpLnRS)
{% endtab %}
{% endtabs %}

```
cd k8s
```

```
kubectl get nodes
```

![](/files/-MOSPWTts_ixQEjK4yng)

```
kubectl create deployment httpd-app --image=httpd
```

```
kubectl expose deployment httpd-app --type=NodePort --name=httpd-service --port=80
```

```
kubectl get svc
```

![](/files/-MOSPlUTwe7A7RJAngWV)

{% hint style="danger" %}
檢查是否連接：`IP 位址:[ httpd-service's port(s) ]`
{% endhint %}

{% tabs %}
{% tab title="vm1" %}
![](/files/-MOSQ7Oi7r8rWk_Tqkal)
{% endtab %}

{% tab title="vm2" %}
![](/files/-MOSQGfehxR_xarTgKI_)
{% endtab %}

{% tab title="vm3" %}
![](/files/-MOSQfYse5q9vRKva2lp)
{% endtab %}
{% endtabs %}

{% hint style="danger" %}
初始化k8s

```
kubeadm reset
```

{% endhint %}

```
kubectl describe node [ master ]
```

![](/files/-MOSV_l31FLsaTxFLWco)

```
kubectl get deployment
```

![](/files/-MOSWtq2W69SqT8TAzZ9)

```
kubectl scale deployment httpd-app --replicas 2
```

```
kubectl get deployment
```

![](/files/-MOSXzGeoSAuxAXn6equ)

```
kubectl create deployment web1 --image=httpd
```

```
kubectl get deployment
```

```
kubectl describe deployment web1
```

![](/files/-MOSZ_fX8j8uvLv3KoFO)

```
kubectl create deployment web2 --image=http1d
```

```
kubectl get deployment
```

```
kubectl describe deployment web1
```

![](/files/-MOSZrO6nL60n95DDYde)

```
kubectl get pod
```

![](/files/-MOS_MSLwyXGT8GPJGtn)

```
kubectl describe pod web2-d9b9cf459-flh2r
```

![](/files/-MOS_n2893VIOGE6xiCu)

```
kubectl delete deployment web2
```

```
kubectl get deployment
```

![](/files/-MOSaDqX5jINIxadp-MM)

```
kubectl get pod
```

![](/files/-MOSaPyW-yJEbRATkbYp)

```
kubectl get deployment
```

```
kubectl get deployment web1 -o yaml
```

![](/files/-MOSba-OdDpGpl6qqeSy)

```
kubectl get deployment web1 -o yaml > myweb.yml
```

```
gedit myweb.yml &
```

```
kubectl apply -f myweb.yml
```

![](/files/-MOSebzeFxPyffuV62Xo)

```
kubectl get deployment
```

```
kubectl get pod
```

```
kubectl get pod -o wide
```

![](/files/-MOSf-rsHzzSN4eMVrpm)

```
curl 10.244.1.3
```

![](/files/-MOSg7I0cr2AwWpNq-Xf)
