[TOC]
## Kubernetes操作
首先我們要了解Kubernetes在運行我們的資源時,資源的構建方式:
* 采用kubectl的命令方式
* yaml文件方式
### Namespace
* 命名空間:主要是為了對Kubernetes中運行的資源進行過隔離, 但是網絡是互通的,類似Docker的容器,可以將多個資源配置到一個NameSpace中。而NameSpace可以對不同環境進行資源隔離,默認情況下Kubernetes提供了default命名空間,在構建資源時,如果不指定資源,默認采用default資源。
命令方式:
```sh
# 查看現有的全部命名空間
kubectl get ns
# 構建命名空間
kubectl create ns 命名空間名稱
# 刪除現有命名空間, 并且會刪除空間下的全部資源
kubectl delete ns 命名空間名稱
```
yaml文件方式:(構建資源時,設置命名空間)
```yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
```
### Pod
* Pod:Kubernetes運行的一組容器,Pod是Kubernetes的最小單位,但是對于Docker而然,Pod中會運行多個Docker容器
* 命令方式:
```bash
# 查看所有運行的pod
kubectl get pods -A
# 查看指定Namespace下的Pod
kubectl get pod [-n 命名空間] #(默認default)
# 創建Pod
kubectl run pod名稱 --image=鏡像名稱
# 查看Pod詳細信息
kubectl describe pod pod名稱
# 刪除pod
kubectl delete pod pod名稱 [-n 命名空間] #(默認default)
# 查看pod輸出的日志
kubectl logs -f pod名稱
# 進去pod容器內部
kubectl exec -it pod名稱 -- bash
# 查看kubernetes給Pod分配的ip信息,并且通過ip和容器的端口,可以直接訪問
kubectl get pod -owide
```
* yaml方式(推薦)
```yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: 運行的pod名稱
name: pod名稱
namespace: 命名空間
spec:
containers:
- image: 鏡像名稱
name: 容器名稱
# 啟動Pod:kubectl apply -f yaml文件名稱
# 刪除Pod:kubectl delete -f yaml文件名稱
```
* Pod中運行多個容器
```yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: 運行的pod名稱
name: pod名稱
namespace: 命名空間
spec:
containers:
- image: 鏡像名稱
name: 容器名稱
- image: 鏡像名稱
name: 容器名稱
```
啟動后可以查看到
| Kuboard效果 |
| :----------------------------------------------------------: |
|  |
### Deployment
部署時,可以通過Deployment管理和編排Pod
Deployment部署實現
- 命令方式
```sh
# 基于Deployment啟動容器
kubectl create deployment deployment名稱 --image=鏡像名稱
# 用deployment啟動的容器會在被刪除后自動再次創建,達到故障漂移的效果
# 需要使用deploy的方式刪除deploy
# 查看現在的deployment
kubectl get deployment
# 刪除deployment
kubectl delete deployment deployment名稱
# 基于Deployment啟動容器并設置Pod集群數
kubectl create deployment deployment名稱 --image=鏡像名稱 --replicas 集群個數
```
- [配置文件方式](https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/)
```yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
```
正常使用kubectl運行yaml即可
彈性伸縮功能
```sh
# 基于scale實現彈性伸縮
kubectl scale deploy/Deployment名稱 --replicas 集群個數
# 或者修改yaml文件
kubectl edit deploy Deployment名稱
```
| 圖形化頁面修改 |
| :----------------------------------------------------------: |
| |
灰度發布
Deploy可以在部署新版本數據時,成功啟動一個pod,才會下線一個老版本的Pod
```shell
kubectl set image deployment/Deployment名稱 容器名=鏡像:版本
```
### Service
可以將多個Pod對外暴露一個Service,讓客戶端可以通過Service訪問到這一組Pod,并且可以實現負載均衡
ClusterIP方式:
ClusterIP是集群內部Pod之間的訪問方式
- 命令實現效果
```sh
# 通過生成service映射一個Deployment下的所有pod中的某一個端口的容器
kubectl expose deployment Deployment名稱 --port=Service端口號 --target-port=Pod內容器端口
```
之后通過`kubectl get service`查看Service提供的ip,即可訪問
| kubectl get service |
| :----------------------------------------------------------: |
|  |
也可以通過`Deployment名稱.namespace名稱.svc`作為域名訪問
| 在服務容器內執行 |
| :----------------------------------------------------------: |
|  |
NodePort方式
ClusterIP的方式只能在Pod內部實現訪問,但是一般需要對外暴露網關,所以需要NodePort的方式Pod外暴露訪問
- 命令實現方式
```sh
# 通過生成service映射一個Deployment下的所有pod中的某一個端口的容器
kubectl expose deployment Deployment名稱 --port=Service端口號 --target-port=Pod內容器端口 --type=NodePort
```
| 查看Service效果 |
| :----------------------------------------------------------: |
|  |
| |
Service也可以通過yaml文件實現
```yaml
apiVersion: v1
kind: Service
metadata:
labels
app: nginx
name: nginx
spec:
selector:
app: nginx
ports:
- port: 8888
protocol: TCP
targetPort: 80
```
通過apply啟動就也可以創建Service
測試效果-Deployment部署,通過Service暴露
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
labels:
app: nginx-deployment
spec:
containers:
- name: nginx-deployment
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-service
name: nginx-service
spec:
selector:
app: nginx-deployment
ports:
- port: 8888
protocol: TCP
targetPort: 80
type: NodePort
```
可以查看到暴露的信息
| Service信息 |
| :----------------------------------------------------------: |
||
### Ingress
Kubernetes推薦將Ingress作為所有Service的入口,提供統一的入口,避免多個服務之間需要記錄大量的IP或者域名,畢竟IP可能改變,服務太多域名記錄不方便。
Ingress底層其實就是一個Nginx, 可以在Kuboard上直接點擊安裝
| Kuboard安裝 |
| :----------------------------------------------------------: |
|  |
|  |
因為副本數默認為1,但是k8s整體集群就2個節點,所以顯示下面即為安裝成功
| 安裝成功 |
| :----------------------------------------------------------: |
|  |
可以將Ingress接收到的請求轉發到不同的Service中。
推薦使用yaml文件方式
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
spec:
ingressClassName: ingress
rules:
- host: nginx.mashibing.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service
port:
number: 8888
```
| 啟動時問題 |
| :----------------------------------------------------------: |
|  |
Kuboard安裝的Ingress有admission的校驗配置,需要先刪除配置再啟動
找到指定的ingress的校驗信息,刪除即可
| 刪除信息 |
| :----------------------------------------------------------: |
|  |
```sh
# 查看校驗webhook的配置
kubectl get -A ValidatingWebhookConfiguration
# 刪除指定的校驗
kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
```
配置本地hosts文件
| 配置hosts |
| :----------------------------------------------------------: |
|  |
記下來既可以訪問在Service中暴露的Nginx信息
| 服通過Ingress訪問 |
| :----------------------------------------------------------: |
|  |
- DevOps介紹
- 持續集成流程
- git工作流實踐
- 新人準備git環境
- git工作流最佳實踐
- jenkins基礎入門
- jenkins簡介
- jenkins安裝(docker)
- 源碼拉取
- maven構建
- 應用發布
- 結合gitlab版本管理
- jenkins-docker部署
- harbor鏡像發布
- jenkins集成SonarQube
- SonarQube代碼檢測
- 集成SonarQube
- jenkins-pipeline
- 構建pipeline任務
- pipeline基礎結構
- pipeline核心語法
- jenkinsfile構建
- 完整案例
- 整合釘釘發送通知
- 腳本使用憑證信息
- jenkins結合k8s使用
- k8s架構及基礎概念
- k8s操作命令
- jenkins部署k8s
- 附錄(其他未完成)
- jenkins高可用服務搭建
- gitlab-docker環境搭建
- 開發人員安裝git
- JDK與maven
- docker安裝gitlab
- docker安裝
- docker-compose安裝
- harbor安裝
- SonarQube安裝
- 2.暫時沒寫的內容
- 構建結果郵件發送
- 已有項目上傳gitlab