---
# System prepended metadata

title: K8S yaml template
tags: [K8S]

---

---
tags: K8S
---
# K8S yaml template

## 撰寫K8S 常見物件 yaml檔 的範例

## 1. POD
```yaml
apiVersion: v1
kind: Pod
metadata:
  name: POD
spec:
  hostname: phn 
  containers:
  - name: cd
    image: busybox
```
## 2. Deployment Object
``` yaml
kind: Deployment
apiVersion: apps/v1
metadata:
  name: s1.dep
spec:
  replicas: 2
  selector:
    matchLabels:
      app: s1.pod
  template:
    metadata:
      labels:
        app: s1.pod
    spec:
      containers:
      - name: derbyapp
        image: busybox
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8888
```
## 3. Volume
### 3-1 Hostpath
- 這是 PersistantVolume(pv), 它會自動產生 /opt/hostpath 目錄, pod-hp 這個 POD 如被刪除, /opt/hostpath 會被保留
```yaml=
kind: Pod
apiVersion: v1
metadata:
  name: pod-hp
spec:
  containers:
    - name: pod-hp
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: hp-volume
  volumes: 
    - name: hp-volume
      hostPath:                        
        path: /opt/hostpath
```
### 3-2 Local
- 只要是 Local Volume 一定要透過 Persistent Volume 定義檔來使用, 在定義檔中, 還一定要宣告 nodeAffinity，在主機, 必需自行先建立/opt/local 目錄
```yaml=
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  local:
    path: "/opt/local"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - cg60(主機名稱) ' > pv-local.yaml 
```
### 3-3 PersistantVolumeClaim(PVC)
- 建立 PVC 會立即搜尋可用的 PV, 然後建立連接
- storageClassName: "" K3S必須宣告這行
```yaml=
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvc-local
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: ""  
  resources:
    requests:
      storage: 3Gi
```
### 3-3-1 PVC的使用
```yaml=
kind: Pod
apiVersion: v1
metadata:
  name: pod-pvc1
spec:
  volumes:
    - name: pv-storage
      persistentVolumeClaim:
       claimName: pvc-local
  containers:
    - name: pod-pvc1
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-storage
```
## 4. Service
- 沒有宣告 Service Type, K8S Service 內定使用 ClusterIP, 這個 Cluster IP 只有 K8S 叢集中的 Node (實體主機)可以存取
### 4-1 ClusterIP
``` yaml
kind: Service
apiVersion: v1
metadata:
  name: s1-service
spec:
  selector:
    app: s1.pod 
  ports:
    - port: 9999
      targetPort: 8888
```
### 4-2 External IP
- 修改 IP 位址, 可以是 Kubernetes 叢集中任何一部實體主機對外的 IP 位址, 包括 Master 主機
```yaml=
kind: Service
apiVersion: v1
metadata:
  name: myextip
spec:
  externalIPs:
  - $IP
  selector:
    app: s1.pod
  ports:
  - port: 8080
    targetPort: 8888
```
### 4-3 NodePort

```yaml=
apiVersion: v1
kind: Service
metadata:  
  name: my-nodeport-service
spec:
  selector:
    app: s1.pod
  type: NodePort
  ports:
  - port: 9999
    targetPort: 8888
    nodePort: 30036
    protocol: TCP 

```
## 5.  Horizontal Pod Autoscaler
- 設定 50 代表 HPA 將會維持每個 Pod 的平均 CPU 使用率為 50 %
```yaml=
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-sp
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hpa-dep
  minReplicas: 2
  maxReplicas: 6
  targetCPUUtilizationPercentage: 50
```
- 要使用 HPA 就一定要宣告資源請求
```yaml=
apiVersion: apps/v1
kind: Deployment
	::
      containers:
	::
        resources:
          requests:
            cpu: 70m

```
## 6. Persistant Volume
### 6-1 HostPath PersistentVolume
- 它會自動產生 /opt/hostpath 目錄, pod-hp 這個 POD 如被刪除, /opt/hostpath 會被保留
- 不會產生 PV Object
- 
```yaml=
kind: Pod
apiVersion: v1
metadata:
  name: pod-hp
spec:
  containers:
    - name: pod-hp
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: hp-volume
  volumes:
    - name: hp-volume
      hostPath:
        path: /opt/hostpath
```
### 6-2 Local PersistentVolume
- Local與Host最大差別，Local一定要透過PVC宣告檔來使用
- 只要是 Local Volume 一定要透過 Persistent Volume 定義檔來使用, 在定義檔中, 還一定要宣告 nodeAffinity
- 必需自行先建立 /opt/local 目錄
```yaml=
kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv-local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  local:
    path: "/opt/local"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - #主機名稱
```