[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效果 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/75/89/75897917599974c3d3de9e06e250002b_1917x963.png) |
### 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名称
```
| 图形化页面修改 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/db/6d/db6d66d9f49f07f5ab7c3eb30924d451_1918x795.png)|
灰度发布
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 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/66/14/66148ef145477314f7e038f85f96b0b9_866x263.png) |
也可以通过`Deployment名称.namespace名称.svc`作为域名访问
| 在服务容器内执行 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/5f/70/5f70848d6f9cde40b996898035829309_980x259.png) |
NodePort方式
ClusterIP的方式只能在Pod内部实现访问,但是一般需要对外暴露网关,所以需要NodePort的方式Pod外暴露访问
- 命令实现方式
```sh
# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 --type=NodePort
```
| 查看Service效果 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/18/bd/18bd1ef013f4aa1ab68985ffca5edc1d_1345x172.png) |
| ![](https://img.kancloud.cn/de/73/de73371db0b28e074121bcda8bf1814e_812x170.png)|
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信息 |
| :----------------------------------------------------------: |
|![](https://img.kancloud.cn/4a/38/4a387b6520bbf8258f676f09a9332c5b_907x93.png)|
### Ingress
Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。
Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装
| Kuboard安装 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/0c/67/0c67bd3fbfbf4c0967217161383135ad_1917x566.png) |
| ![](https://img.kancloud.cn/a4/32/a432443dc9c54207c519595b9cb1ecdd_1860x740.png) |
因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功
| 安装成功 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/db/bd/dbbde90380d50defb5d18b66f9e99dfb_1902x862.png) |
可以将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
```
| 启动时问题 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/66/50/6650adcc9545ced2c16fcc7373b3832e_1876x114.png) |
Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动
找到指定的ingress的校验信息,删除即可
| 删除信息 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/c2/7f/c27f4ce18d92ad0c231b982f82b80963_1413x180.png) |
```sh
# 查看校验webhook的配置
kubectl get -A ValidatingWebhookConfiguration
# 删除指定的校验
kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller
```
配置本地hosts文件
| 配置hosts |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/36/b5/36b566aa81e32cfaec02840cf77a1585_1117x539.png) |
记下来既可以访问在Service中暴露的Nginx信息
| 服通过Ingress访问 |
| :----------------------------------------------------------: |
| ![](https://img.kancloud.cn/5f/64/5f64761762042aa5c75fdbfce9c06f32_779x148.png) |
- 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