# 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)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://anida-huang.gitbook.io/cloud-communication/qi-mo/kubernetes-yi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
