# K8s OverView
> [name=李俊毅]
> [time=Thur, Feb 9, 2020 4:00 PM]
---
## Agenda
* K8s Concepts
* K8s CLI
* K8s YAML
* Demo
* 課後動腦
---
## K8s Concepts
----
### 什麼是K8s
----

----
K8S是kubernetes縮寫,是一套管理容器的平台,是由 Pod、Node、 Master 組合而成
----
### K8s特性
| | |
| ---------- | --------------------- |
| 無維護更新 | 支援滾動式更新 |
| 分流機制 | 負載均衡和服務發現 |
| 高可用性 | 支援自動擴展與伸縮 |
----
### Pod

----
### Node

----
### K8s架構

----
| Item | Description |
| ------------------ | ------------------------------------------------------------ |
| etcd | 保存了整個性能的狀態 |
| apiserver | 提供了資源操作的唯一入口,並提供認證,授權,訪問控制,API XML和發現等機制|
| controller manager | 負責維護維護的狀態,可以進行故障檢測,自動擴展,滾動更新等 |
| scheduler | 負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上 |
----
| Item | Description |
| ----------------- | ------------------------------------------ |
| Network | 負責網絡管理 |
| kubelet | 接收 API Server 任務及向API Server註冊節點訊息 |
| container runtime | 負責監督管理Pod和容器 |
| kube-proxy | 負責為服務提供群集內部的服務發現和負載均衡 |
---
## K8s CLI
----
### 什麼是 Kubectl
用來控制Kubernetes集群的命令行工具
----
### Kubectl 語法
<style>
code {
font-size: x-large;
text-align: center;
}
</style>
```
kubectl [command] [TYPE] [NAME] [flags]
```
----
### 例子
```
kubectl get pods
```
----
### Kubectl 基本指令
* [kubectl run](/xySj55yxQHSD8lNzOonDqg)
* [kubectl create](/1tqmi8swQmG2cs02H-DIIQ)
* [kubectl expose](/jVYfSpJRTQCvqMhWN6E9vA)
* [kubectl get](/OFOW10I6RK6IufcwzQuAvg)
* [kubectl logs](/nABxzf0_Sii5ruhxyoAmRQ)
* [kubectl delete](/VNcRZzh9QyeaIs14zARpKQ)
* [kubectl exec](/6GrDz8U6T_KcH4n7pS2rZA)
* [kubectl apply](/B1ZUio8yTOe-Xeg_fmw9iQ)
* [kubectl version](/vgtGAfQZQRKKy8O7nWYXsQ)
* [kubectl cluster-info](/1ECYMUZdTUqp75hn5zh_NQ)
----
### 與 Docker 指令關係
----
#### Docker run
<h5 style="text-align: left;">使用docker:</h5>
```
docker run -d --name nginx-app -p 80:80 --restart=always nginx:1.8
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
<style>
code {
text-align: left;
}
</style>
```
kubectl run nginx-app --image=nginx:1.8 --port=80
kubectl expose deploy nginx-app --type=NodePort --port=80 --target-port=80 --name=nginx-http
```
----
#### Docker ps
<h5 style="text-align: left;">使用docker:</h5>
```
docker ps -a
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
```
kubectl get pods --all-namespaces
```
----
#### Docker exec
<h5 style="text-align: left;">使用docker:</h5>
```
docker exec -it nginx-app bash
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
```
kubectl exec -it nginx-app-769f5f6985-79hh4 bash
```
----
#### Docker logs
<h5 style="text-align: left;">使用docker:</h5>
```
docker logs -f nginx-app
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
```
kubectl logs -f nginx-app-769f5f6985-79hh4
```
----
#### Docker rm
<h5 style="text-align: left;">使用docker:</h5>
```
docker rm nginx-app
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
```
kubectl delete deployment nginx-app
```
----
#### Docker version
<h5 style="text-align: left;">使用docker:</h5>
```
docker version
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
```
kubectl version
```
----
#### Docker info
<h5 style="text-align: left;">使用docker:</h5>
```
docker info
```
</br>
<h5 style="text-align: left;">使用kubectl:</h5>
```
kubectl cluster-info
```
---
## K8s YAML
----
### 什麼是 YAML
原本透過 Kubectl run 命令運行 deployment,可透過 YAML 進行配置與代碼化
----
### 常用的資源型態
* [Deployment](/yjIGaKU9SHa07gS8ubQ11g)
* [Service](/s7DKutPBTAOhCrUnhlgj7g)
----
#### Deployment Concepts
----
Deployment 透過 ReplicaSet 管理Pod,適用於無狀態部署,Pod Name為無序命名

----
##### Deployment YAML
```
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: load-balancer-example
name: hello-world
spec:
replicas: 5
selector:
matchLabels:
app.kubernetes.io/name: load-balancer-example
template:
metadata:
labels:
app.kubernetes.io/name: load-balancer-example
spec:
containers:
- image: gcr.io/google-samples/node-hello:1.0
name: hello-world
ports:
- containerPort: 8080
```
----
#### Servcie Concepts
----
Service 為一組Pod提供一個統一的入口,並為它們提供負載均衡和自動服務發現

----
##### Servcie YAML
```
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
selector:
app.kubernetes.io/name: load-balancer-example
ports:
- port: 8080
targetPort: 8080
```
---
## Demo
```
kubectl create deploy nginx --image=nginx:latest
kubectl create svc nodeport nginx --tcp=80:80
```
---
## 課後動腦
* 1.K8s 最小單位是什麼?
* 2.在 K8s 中 Container 是存放在哪裡?
* 3.使用K8s 上執行 web 服務,並可連線到 web 服務並進行 scale
* 4.Service、Deployment、Replicaset 與 Pod 之間的關係是?
{"metaMigratedAt":"2023-06-15T09:24:36.494Z","metaMigratedFrom":"YAML","title":"K8S OverView","breaks":true,"contributors":"[{\"id\":\"4f5c5dc0-df78-40b6-8b4c-d0c83c7416cb\",\"add\":291,\"del\":291},{\"id\":\"3fb4bc3a-7154-4d90-b785-69b4345d269a\",\"add\":5239,\"del\":0}]"}