[部署06] Kubernetes02

256 阅读5分钟

导航

[react] Hooks

[封装01-设计模式] 设计原则 和 工厂模式(简单抽象方法) 适配器模式 装饰器模式
[封装02-设计模式] 命令模式 享元模式 组合模式 代理模式
[封装03-设计模式] Decorator 装饰器模式在前端的应用
[封装04-设计模式] Publish Subscribe 发布订阅模式在前端的应用
[封装05-ElementUI源码01] Row Col Container Header Aside Main Footer

[React 从零实践01-后台] 代码分割
[React 从零实践02-后台] 权限控制
[React 从零实践03-后台] 自定义hooks
[React 从零实践04-后台] docker-compose 部署react+egg+nginx+mysql
[React 从零实践05-后台] Gitlab-CI使用Docker自动化部署

[源码-webpack01-前置知识] AST抽象语法树
[源码-webpack02-前置知识] Tapable
[源码-webpack03] 手写webpack - compiler简单编译流程
[源码] Redux React-Redux01
[源码] axios
[源码] koa
[源码] vuex
[源码-vue01] data响应式 和 初始化渲染
[源码-vue02] computed 响应式 - 初始化,访问,更新过程
[源码-vue03] watch 侦听属性 - 初始化和更新
[源码-vue04] Vue.set 和 vm.$set
[源码-vue05] Vue.extend

[源码-vue06] Vue.nextTick 和 vm.$nextTick
[源码-vue07] keep-alive

[源码-react01] ReactDOM.render01
[源码-react02] 手写hook调度-useState实现

[部署01] Nginx
[部署02] Docker 部署vue项目
[部署03] gitlab-CI
[部署04] [复习] gitlabCI + docker-compose + ssh免密登录 + 最全Dockerfile
[部署05] Kubernetes01
[部署06] Kubernetes02

[数据结构和算法01] 二分查找和排序
[数据结构和算法02] 回文字符串
[数据结构和算法03] 栈 和 队列
[数据结构和算法04] 链表 和 树

[深入01] 执行上下文
[深入02] 原型链
[深入03] 继承
[深入04] 事件循环
[深入05] 柯里化 偏函数 函数记忆
[深入06] 隐式转换 和 运算符
[深入07] 浏览器缓存机制(http缓存机制)
[深入08] 前端安全
[深入09] 深浅拷贝
[深入10] Debounce Throttle
[深入11] 前端路由
[深入12] 前端模块化
[深入13] 观察者模式 发布订阅模式 双向数据绑定
[深入14] canvas
[深入15] webSocket
[深入16] webpack
[深入17] http 和 https
[深入18] CSS-interview
[深入19] 手写Promise
[深入20] 手写函数
[深入21] 数据结构和算法 - 二分查找和排序
[深入22] js和v8垃圾回收机制
[深入23] JS设计模式 - 代理,策略,单例
[深入24] Fiber01
[深入25] Typescript
[深入26] Drag

[前端学java01-SpringBoot实战] 环境配置和HelloWorld服务
[前端学java02-SpringBoot实战] mybatis + mysql 实现歌曲增删改查
[前端学java03-SpringBoot实战] lombok,日志,部署
[前端学java04-SpringBoot实战] 静态资源 + 拦截器 + 前后端文件上传
[前端学java05-SpringBoot实战] 常用注解 + redis实现统计功能
[前端学java06-SpringBoot实战] 注入 + Swagger2 3.0 + 单元测试JUnit5
[前端学java07-SpringBoot实战] IOC扫描器 + 事务 + Jackson
[前端学java08-SpringBoot实战总结1-7] 阶段性总结
[前端学java09-SpringBoot实战] 多模块配置 + Mybatis-plus + 单多模块打包部署
[前端学java10-SpringBoot实战] bean赋值转换 + 参数校验 + 全局异常处理
[前端学java11-SpringSecurity] 配置 + 内存 + 数据库 = 三种方式实现RBAC
[前端学java12-SpringSecurity] JWT
[前端学java13-SpringCloud] Eureka + RestTemplate + Zuul + Ribbon
[前端学java14-Mybatis Plus] 分页插件 和 乐观锁插件

复习笔记-01
复习笔记-02
复习笔记-03
复习笔记-04

前置知识

(1) 一些单词

kubernetes 舵手 驾驭者,从图标就能看出来
firewall 防火墙
daemon 守护进程
rollout 上线 试运行 首次展示
replica 复制品 仿制品
ingress 入口 入口权
balancer 平衡器

terminate 终止

(2) windows 安装 vmware

1
遇到问题:centos7 的 ip 无法查看
分析原因:因为centos7默认不启动网卡
如何解决:
- 1.查看 ens33 网卡配置
  - vi /etc/sysconfig/network-scripts/ifcfg-ens33
- 2.修改配置
  - ONBOOT=no 修改为 ONBOOT=yes
- 3.重启网络服务
  - service network restart
- 4.查看ip
  - ip a
  
2
遇到问题:centos7的主机每次启动都会从新分配新的ip,如何固定住ip?
回答:
  - 1.同样的 vi /etc/sysconfig/network-scripts/ifcfg-ens33
  - 2. 将 ( BOORPROTO = 'dhcp' ) 改为 ( BOOTPROTO = 'static' )
  - 3. 将静态ip设置为: IPADDR=192.168.163.130
  - 4. 然后重启即可

(3) kubernetes 环境准备 和 安装

扩展
- 问题:如何使用xshell快速在多台虚拟机上输入相同的命令?
- 回答:
  - 查看/撰写/勾选上-撰写栏
  - 然后点击底部的图标/勾选上-全部会话
---

1. 上面已经准备好了 vmware 和 centos7的两台主机 master node1

2. 关闭防火墙
  - systemctl stop firewalld
  - systemctl disable firewalld
  
3. 关闭 selinux
  - 永久禁用:sed -i 's/enforcing/disabled/' /etc/selinux/cofnig
  - 临时禁用:setenforce 0
  - 注意:我们选择永久禁用,永久禁用是需要 ( 重启 ) 主机才会生效
  
4. 关闭 swap ( k8s禁止虚拟内存以提交性能 )
  - 永久:sed -ri 's/.*swap.*/#&/' /etc/fstab
  - 临时:swapoff -a
  
5. 在 master 添加 hosts
cat >> /etc/hosts << EOF
192.168.163.128 k8smaster
192.168.163.129 k8snode
EOF

6. 设置网桥参数
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
让上面的配置生效: sysctl --system

7. 时间同步
下载时间同步:yum install ntpdate -y
同步所有机器时间:ntpdate time.windows.com
查看本机时间:date


[ 以上1-7步是设置centos7每台主机的配置 ]
[ 接下来我们需要在每台主机上都安装 Docker + kubeadm + kubelet + kubectl ]



8. centos7中安装dokcer
- 问题:为什么 kubernetes 需要 docker 环境?
- 回答:因为 kubernetes 中的 容器 的默认运行环境是 dokcer
- (1) 安装 wget
  - yum install wget -y
- (2) 更新 yum 源为阿里源,下载就更快
  - wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  - 查看是否写入成功:cat /etc/yum.repos.d/docker-ce.repo
- (3) 安装指定版本的 docker
  - yum install docker-ce-19.03.13 -y
- (4) 给Docker配置加速器
  - 在 /etc 文件夹中新建docker文件夹,再在docker文件夹中新建daemon.json文件 - docker/daemon.json 
  - cd /etc
  - mkdir docker
  - cd docker
  - vi daemon.json
  - 写入的内容是:{ "registry-mirrors": ["https://registry.docker-cn.com"] }
- (5) centos重启后,自动开启docker
  - systemctl enable docker.service
  - 不然会提示警告
  
  
  
9. 安装 kubeamd 和 kubelet 和 kubectl
- kubelet
  - 运行在 cluster 所有节点上,负责启动 POD 和 容器
- kubeadm
  - 用于初始化 cluster
- kubectl
  - kubectl 是 kubernetes 命令行工具,通过 kubectl 可以部署和管理应用,查看,创建,删除,更新组件
- (1) 阿里云 kubernetes yum 仓库镜像
  - 安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum仓库镜
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
- (2) 安装 kubeadm kubelet kubectl 3个组件
  - 安装:yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
  - 开机启动:systemctl enable kubelet.service 不然会警告
- (3) 查看上面 3 个组件是否安装好
  - yum list installed | grep kubelet
  - yum list installed | grep kubeadm
  - yum list installed | grep kubectl
- !!!!!!!!!!!!!!!!!!!!!!!! ---- kubeadm init ---- !!!!!!!!!!!!!!!!!!!!!!!!
- (4) 通过 kubeadm 来安装 master 节点
  - 在 master 主机上执行以下命令
kubeadm init --apiserver-advertise-address=192.168.163.128 #kubeadm所在机器的IP
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version v1.19.4 #kubernetes版本
--service-cidr=10.96.0.0/12 #service网络空间
--pod-network-cidr=10.244.0.0/16 #pod网络空间
  - 输入以上命令后报了很多错
    - reboot 该命令的作用是重启计算机
    - 重启再次执行上面的命令
    - 此时会下载,如果下载失败再次执行上面的命令,直到成功
    - 如果安装成功,会提示输入以下命令
- (5) 输入 cubectl get nodes 查看节点
- !!!!!!!!!!!!!!!!!!!!!!!! ---- kubeadm join ---- !!!!!!!!!!!!!!!!!!!!!!!!
- (6) cubeadm 的格式如下
  - 遇到问题:
    - 问题:如果cubeadm join 时忘记了怎么办?
    - 回答:使用命令 kubeadm token create --print-join-command
  - 注意:以下命令是在 node 主机上执行的,而不是 master 主机上执行的
  - 同样:添加成功后,再通过 kubectl get nodes 来查看
 
- (7) 经过了(1)-(6)步之后,我们可以在 master 上查看所有的node节点
  - 命令:kubectl get nodes
  - 但是:
    - 会出现master和node上都出现 NotReady 的情况
    - 也就是说:master和node是不能相互通信的,不能相互访问
  - 所以:
    - 我们需要去下载一个插件 (  kube-flannel.yml ) 文件
    - wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    - 如果安装失败,我们可以手动的安装
      - a. 先安装lrzsz,是一个下载上传的工具: yum install lrzsz -y 
- (8) 在 master上 应用 下载好的 kube-flannel.yml 文件,得到运行时容器
  - kubectl apply -f kube-flannel.yml
- (10) 然后验证是否有没有添加成功
  - kubectl 

(4) linux 中的一些常用命令

1
EOF
- EOF:end of file 的意思,表示 ( 自定义终止符 )
- ( $a=<<"EOF" ) 的意思是:( 下一行开始,知道遇到 EOF 为止,所有的字符都按照指定的格式存入变量a中 )

(5) Dockerfile 复习

(1) docker build
---
docker build --target node --build-arg -f Dockerfile文件的路径 -t 镜像名:标签名 .
docker build --target node --build-arg NAME=woow -f Dockerfile -t nginx .
-f ----------------- 是file的缩写,用来指定 --------- ( Dockerfile文件路径 )
-t ----------------- 是tag的缩写,用来指定生成的 ----- ( 镜像名和标签 ) 
--target=<as的值> 
  - 用来明确的指定需要构建的target
    - 因为:在Dockerfile中 ( From nginx as nginx )  as 后面的就是target,Dockerfile中可能有多个FROM指定的基准对象
    - 同时:在多阶段构建中,COPY --from=<as名称> 获取中间镜像中的数据
--build-arg <参数名>=<参数值> --------------------- 用来覆盖Dockerfile中通过ARG指定的环境变量,将变量覆盖掉
注意:最后面有一个 .


---
(2) 案例 - docker多阶段构建镜像
链接:https://juejin.cn/post/7066315404561350670#heading-9

(一) kubernetes 整体架构

1
组成
 - 一个kubernetes集群主要由 ( master节点 - 控制节点 ) 和 ( node节点 - 工作节点 ) 构成
 - 每个节点上都会安装不同的 ( 组件 ) - 注意区分组件和插件的区别
 - master ------- 控制节点 -------- 管理
 - node --------- 工作节点 -------- 干活 
 
2
master 上的组件
- ApiServer:资源操作的唯一入口,接收用户输入的命令,提供认证,授权,api注册和发现等机制
- Scheduler:算 - 负责计算,调度
- ControllerManage:Scheduler算好了Control安排别人干 - 将Scheduler计算号的调度,传递给node节点的kubelet
- Etcd:数据库,负责存储集群中的各种资源对象信息

3
node节点上的组件
- Kubelet:负责维护容器的生命周期,即通过控制 docker,来创建,更新,销毁容器 ( 发送命令给Docker )
- KubeProxy:负责提供集群内部 ( 服务发现 和 负载均衡 )
- Docker:负责节点上容器的各种操作

4
注意点
以部署一个nginix为例
- 1. 一旦kubernetes启动后,master节点和node节点上的所有信息都会存储到 etcd 中
- 2. 请求会发现到master节点上的 ApiServer 中
- 3. scheduler计算好后会通知给 ApiServer
- 4. 第三步scheduler计算好通知给apiserver后,apiserver会调用controller,让controler去调度node节点安装nginx
- 5. kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,容器是跑在pod中的
- 6. nginx服务运行后,如果需要访问nginx,就需要 node节点的 KubeProxy来对pod产生访问的代理,这样用户就能访问到node服务服务

5
集群的类型
- 一主多从
  - 缺点:单机故障风险,因为只有一个master,宕机后整个服务将不能正常运行
  - 适用:只适合 - 测试环境
- 多主多从
  - 优点:安全性高,适合生产环境

image.png image.png

(二) 资源管理

kubernetes的资源管理方式一共分为三种
- 命令式对象管理 ------ 直接使用命令去操作kubenetes资源
- 命令式对象配置 ------ 通过 ( 命令配置 和 配置文件 ) 去操作 kubernetes 资源
- 声明式对象配置
---

1
命令式对象管理
- kubectl run nginx-pod --image=nginx --port=80
- 比较少用

2
命令式对象配置
- kubectl create/patch -f nginx-pod.yaml
- 命令:kubectl create/patch
- 参数:即将参数写到了配置文件中

3
声明式对象配置
- kubelctl apply -f nginx-pod.yaml
- 命令:apply 用来 ( 创建和更新 ) 资源

(2.1) 常用命令 - 命令式对象管理

kubectl [command] [type] [name] [flags]
---
command: -------- 命令 ------ 对资源之行的操作,比如 --- create get delete describe
type: ----------- 资源类型 --- 比如:----------------- deployment service namescpce label
name: ----------- 资源名称 --- 大小写敏感
flags: ---------- 可选参数
---

command
- 基本命令
  - get ---------- 获取
  - create ------- 创建
  - delete ------- 删除
  - edit --------- 编辑
  - patch -------- 更新
  - explain ------ 解释 ----------- 展示资源文档
- 运行和调试
  - run ---------- 运行一个指定的镜像
  - expose ------- 暴露资源为 service
  - describe ----- 显示资源内部信息
  - logs --------- 输出容器在pod中的日志
  - attach ------- 进入运行中的容器
  - exec --------- 执行容器中的一个命令
  - cp ----------- 在 pod 内外赋值文件
  - rollout ------ 管理资源的发布
  - scale -------- 扩容 pod 数量
  - autoscale ---- 自动调整 pod 数量
- 高级命令
  - apply -------- 通过文件对资源进行配置
  - label -------- 更新资源上的标签
- 其他命令
  - cluster-info - 显示集群信息
  - version ------ 显示当前 service 和 client 的版本
  

type
- 问题:如何查看所有资源
- 回答:kubectl api-resources
kubelctl 常用命令
---

kubecyl create namespaces dev -------- 创建 dev 命名空间
kubectl get namespaces --------------- 获取命名空间
kubectl get ns ----------------------- 简写,获取命名空间
kubectl run pod --image=nginx -n dev - 在命名空间dev下创建一个nginx的pod
kubectl get pod -n dev --------------- 查看命名空间dev下的pod
kubectl describe pod pod名 -n dev ----- 查看命名空间dev下的pod名为xxx的内部信息
kubectl delete pod pod名 --- 注意这个默认是default命名空间下,如果pod在其他命名空间则需要通过-n来指定

image.png

(三) namespaces 命名空间

kubectl get ns 会展示默认的几个命名空间
---
default ----------- 所有未指定namespaces的对象都会放在default中
kube-node-lease --- 集群节点之间的心跳维护
kube-public ------- 此命令空间下的资源可以被所有用户访问 ( 包括未认证用户 )
kube-system ------- 系统创建的资源在该命名空间中

1
命令方式
创建:kubectl create ns dev
获取:kubectl get ns dev
删除:kubectl delete ns dev

2
配置文件的方法
ns-dev.yaml
--
apiVersion: v1
kind: NameSpace
metadata:
  name: dev
--
创建:kubectl crate -f ns-dev.yaml
删除:kubectl delete -f na-dev.yaml

(四) pod

  • 概念:pod是kubenetes集群进行管理的 ( 最小单元 )
  • 程序,容器,pod三者的关系:程序部署在容器中,容器存在于pod中
  • 大小:一个 ( pod ) 中可以有 一个或者多个 ( 容器 )
  • 容器:容器分为 ( 根容器 ) 和 ( 用户容器 )
  • 组件:kubenetes中的组件也是运行在 pod 中的,只不过在 ( kube-system ) 命名空间
  • imagePullPolicy - 镜像拉取策略
    • Always: 总是从远程仓库拉取镜像
    • IfNotPresent: 本地有就使用本地的,没有从远程拉取
    • Never: 只使用本地镜像,没有就报错
  • EmptyDir - 最基本的volumn
    • 是什么:EmptyDir 是最基础的 Volumn 类型
    • 生命周期:和 pod 的生命周期相同
      • 创建:在 Pod 被分配到 Node 时创建,初始内容是空
      • 销毁:当pod销毁时,EmptyDir中的数据也会被永久删除
    • 应用:
      • 1.临时空间:无需永久保存的临时目录
      • 2.共享数据:一个容器需要和另一个容器共享数据
(一) Pod 命令方式
---

1
系统内部的一些pods
- kubectl get pod -n kube-system

2
创建并运行pod
- 命令格式:kubectl run (pod控制器名称) [参数]
- kubectl run nginx --image=nginx:1.17.1 --port=80 --namespce dev
  --image 指定pod镜像
  --port 指定端口
  --namespace 指定命名空间
  
3
查看
- 查看pod:------------- kubectl get pod -n dev
- 查看pod的更多信息:---- kubectl get pod -n dev -o wide
- 查看pod的信息中带标签 - kubectl get pod -n dev --show-labels
- 查看具体的pod -------- kubectl get pod pod名 -n dev

4
访问
- 如何查看pod的ip ----- kubectl get pod -n dev -o wide 中就有ip地址 

5
删除
- 注意:如果是删除使用命令 kubectl delete pod pod名 -n dev 删除后又会新启动一个pod
- 所以:我们必须删除pod的控制器
- 如何删除控制器:
  - 查看pod控制器:kubectl get deployment -n dev
  - 简写,查看pod控制器:kubectl get deploy -n dev
  - 删除控制器:kubectl delete deploy pod控制器名 -n dev
(二) Pod 配置文件的方式
pod-nginx.yaml
在真实的部署上,一般都不会直接编写pod的yaml,而是编写pod控制器deployment
---

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
spec:
  containers:
  - name: nginx-container
    image: nginx:1.17.1
    imagePullPolicy: IfNoPresent # ------------ 镜像拉取策略 never IfNotPresent Always
    name: nginx-container
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP
    volumeMounts:
    - name: share-volume # ----------- 将 share-volume 挂载到 nginx 容器的 /var/log/nginx 目录中
      mountPath: /var/log/nginx
  - name: busybox-container
    image: busybox
    imagePullPolicy: Always
    command: ['/bin/sh', "-c", "tain -f /los/access.log"] # -- 该命令会动态的读取指定文件夹中的内容
    volumeMounts: # ----------------- 将 share-volume 挂载到 busybox 容器的 /logs 目录中
    - name: share-volume
      mountPath: /logs
  
  volumes: # ------------------------- 声明 volume,name是share-volume,类型是emptyDir
  - name: share-volume # ------------- nginx和busybox共享数据,即nginx和busybox共享该目录
    emptyDir: {}
     

创建:kubectl create -f pod-nginx.yaml
删除:kubectl delete -f pod-nginx.yaml

volumn
输入命令查看nginx的日志:
- kubectl logs -f volume-emprydir -n dev -c busybox
  -f 表示pod文件
  -c 表示容器

image.png

(五) Label

(1) 基本概念
Label
- 在资源上添加标识,用来对资源进行区分和选择
- 特点
  - 一个Label会以key/value键值对的方式附加到各种对象上,比如 Node Pod Service
  - ( 一个资源对象 ) 可以定义 ( 任意数量 ) 的 ( Label ),同一个Label也可以添加到任意数量的资源对象上去
  - Label通常在资源对象 ( 定义时确定 ),也可以在对象创建后 ( 动态添加或者删除 )
- 架构类型的label一般使用:( tier: front ),( tier: end )


标签选择
- 标签定义完后,还需要考虑标签的选择,使用 Label Selector
  - Label用于给某个资源对象定义标识
  - Label Selector 用于查询和帅选拥有某些标签的资源对象
(2) 标签的使用
命令方式
---

1
打标签:为pod资源打标签
- kubectl label pod nginx-pod -n dev version=1.0
  - 表示给 nginx-pod 的 pod 打上一个标签,标签是 version=1.0
  
2
更新标签:
- kubectl label pod nginx-pod -n dev versioni=2.0 --overwrite

3
查看标签
- kubectl get pod nginx-pod -n dev --show-labels

4
筛选标签
- kubectl get pod -n dev -l version=2.0 --show-labels

5
删除标签
- kubectl label pod nginx-pod version- -n dev
  - 表示删除 nginx-pod 的标签 version 标签
配置文件方式
---
pod-nginx.yaml
--

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: dev
  labels:
    version: "3.0"
    env: "test"
spec:
  containers:
  - image: nginx:1.17.1
    name: pod
    ports:
    - name: nginx-port
      containerPort: 80
      protocol: TCP

(六) Deployment

  • 概念
    • 在 kubernetes 中,pod是最小的控制单元
    • 但 kubernetes 很少直接控制pod,一般都是通过 pod 控制器来完成的,比如deployment
  • pod控制器的作用
    • 当 pod 资源出现故障时,会尝试 ( 重启 或 重建 pod )
  • 种类
    • Deployment:控制器的种类很多,Deployment就是其中一种
  • 问题
    • 问题:pod控制器 和 pod 发生关系是通过什么实现的
    • 回答:是通过 ( 标签 ) 来实现的
  • 问题
    • 问题:如何删除pod
    • 回答:
      • 因为:如果直接删除pod,删除后也会被 pod控制器 新建新的pod
      • 所以:如果要删除pod,就需要删除 ( pod控制器 )
命令方式
---

创建deployment:kubectl run ( deployment控制器名称 ) [参数]
创建deployment:kubectl run nginx --image=nignx:1.17.1 --port=80 --replicas=3 -namespace=dev
  - nginx:表示的是 deployment 的名称
  - image: 表示镜像,根据什么镜像创建deployment
  - replicas:指pod的数量
  - namespce:指命名空间

查看Pod:---------------- kubectl get pods -n -dev
查看Deployment:--------- kubectl get deploy -n -dev
查看Deployment和Pod:---- kubectl get deploy,pods -n dev
查看Label:-------------- kubectl get pods -n dev --show-labels

删除Deployment: kubectl delete deploy ( deployment名 ) -n dev
删除Deployment-命令方式: kubectl delete deploy nginx -n dev
删除Deployment-配置文件的方式:kubectl delete deploy-nginx.yaml
配置方式

1. deploy-nginx.yaml 配置文件编写
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-ningx
  namespace: dev
spec:
  replicas: 3 # -------------------- pod的副本数,即创建几个pod
  selector: # ---------------------- 选择器,label
    matchLabels:
      run: nginx
  template: # ---------------------- pod模版
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - image: nginx:1.17.1
        name: nginx-pod
        ports:
        - containerPort: 80
          protocol: TCP
          
2. 使用命令
kubectl create -f deploymen-nginx.yaml

image.png

(七) Service

1
为什么需要Servie
- ip变化:因为 pod ip 会随着pod重建发生变化,不能产生稳定不变的ip
- 集群外部无法访问:pod ip 只在集群内部可见,( 外部无法访问 )

2
Service
- 概念:Service可以看作是 ( 一组同类pod ) 对外暴露的 ( 访问接口 )
- 功能:服务发现,负载均衡

3
相关命令
- 暴露service
  - kubectl expose deploy deploy名称 --name=service名称 --type=ClusterIP/NodePort --port=servcie端口 --target-port=目标pod端口 -n 命名空间
  - kubectl expose deployment nginx --name=svc-nginx --type=ClusterIP --port=80 --target-port=80 -n dev
    - type:ClusterIP ------ 只能在集群内部访问
    - type:NodePort ------- 可以在集群外部访问
- 查看service ------------- kubectl get svc svc-nginx -n dev -o wide
- 删除service ------------- kubectl delete svc svc-nginx -n dev
- 验证是否对外暴露接口成功
  - curl serviceIp:servicePort
  
4
配置方式
svc-nginx.yaml
--
apiVersion: v1
kind: Service
metadata:
  name: svc-nginx
  namespace: dev
spec:
  clustterIP: 10.108.179.231
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: NodePort

(八) ingress

1
问题:有了service,为什么还需要 ingress
回答:
  - 1.service对外暴露服务主要有 ( NodePort  LoadBalancer ),它们有以下缺点
    - NodePort缺点:会占用很多 ( 集群机器的端口 ),当集群服务变多时,缺点愈发明显
    - LoadBalancer缺点:每个service需要一个LB,并且需要 kubernetes 之外的设备支持
    - 如何解决:ingress
    
2
ingress的两个核心概念
- ingress
  - 对象:kubernetes中的一个 ( 对象 )
  - 作用:定义规则 ( 请求如何转发到service )
- ingress controller
  - 作用:实现 ( 反向代理  负载均衡 )
  

3
搭建ingress环境
- 1.创建文件夹并进入文件夹:mkdir ingress-controller
- 2.获取ingress-nginx:
  - wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
  - wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
- 3.修改 mandatory.yaml 文件中的仓库
  - 修改:quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
  - 修改为:quay-mirror.qiniu.com/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
- 4.创建 ingress-nginx
  - kubectl apply -f ./
- 5.查看查看查看查看查看查看查看查看查看 ingress-nginx
  - kubectl get pod -n ingress-nginx
  
 
4
ingress配置文件yaml的编写
- 文件名:ingress-http.yaml
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-http
  namespace: dev
spec:
  rules:
  - host: nginx.itheima.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80
  - host: tomcat.itheima.com
    http:
      paths:
      - path: /
        backend:
          serviceName: tomcat-service
          servicePort: 8080  

(九) kubenetes部署 vue 项目

(1) 新建 Dockerfile

(1) 新建Dockerfile
# 1
# node

### FROM 引用基础镜像
### - as的作用:
###   - 1. 在输入 ( docker build --target=as的值 ),表示构建具体的镜像,因为 Dockerfile中啃根有多个 FROM 指定基准对象
###   - 2. 在多阶段构建中,( COPY --from=as的值 ) 获取中间镜像层的数据
FROM node as node

### ENV 表示容器中的环境变量
ENV WORK_DIR /app

### WORKDIR 表示进入容器后,默认的工作目录
WORKDIR ${WORK_DIR}

### COPY 拷贝文件
### - 语法:COPY 源路径 目标路径
### - 语法:COPY 宿主机Dockerfile所在的文件夹 容器中的文件夹
### - 语法:COPY --from=as名称  -------- 主要用来拷贝中间镜像次层的数据,主要用于多阶段构建
### - 注意区分 COPY 和 ADD 的区别
COPY . ${WORK_DIR}

### RUN
### - 构建镜像阶段:在新建镜像时执行的命令

### RUN 和 CMD 的区别
### - RUN:构建镜像阶段 ---- 在新建镜像时执行的命令
### - CMD:容器运行阶段 ---- 在容器启动后默认执行的命令和参数
RUN npm install -g cnpm --registry=https://registry.npmmirror.com

RUN cnpm install

RUN cnpm run build

# ------------------------------------
# 2
# nginx
# 这个文件是 ( 多阶段构建 ),同时指定了 node 和 nginx

FROM nginx as nginx

ENV WORK_DIR /app

### COPY from=node 表示将 ( node阶段node容器中的 /app/build文件夹 ) 拷贝到 ( nginx容器的  /usr/share/nginx/html 文件中 )
COPY from=node ${WORK_DIR}/build /usr/share/nginx/html
COPY from=node ${WORK_DIR}/docker/nginx/conf.d /etc/nginx/conf.d
# COPY --from=build ${WORK_DIR}/nginx.conf /etc/nginx/nginx.conf 这个是nginx的配置,而不是容器中nginx的配置
# COPY /docker/nginx/conf.d /root/etc/nginx/conf.d

### EXPOSE 表示暴露端口,类似于 docker run -p
EXPOSE 80

### CMD 是容器启动后默认执行的命令和参数
### 这里之所以要执行nginx -g daemon off; 是为了让容器退出后不关闭
CMD ["nginx", "-g", "daemon off;"]

# 3
# 通过 Dockerfile 构建镜像
# docker build -t ngin_deploy .

# 4
# 4.1 通过镜像生成容器 - docker run -d -p 8020:80 ngin_deploy
# 4.2 如何是通过 kubernetes 来部署的话,直接可以在 deployment 的 pod template 中指定 容器镜像

(2) build 镜像

在Dockerfile文件所在目录执行build命令,构建镜像
---

docker build -t xia-vue .

(3) kubernetes 部署

(1) 
新建 namespace
- cubectl create ns xia



(2) 
创建 deployment 的配置yaml文件
(2.1) 创建 deployment 的配置yaml文件 
- 注意:我们一般不直接创建pod,而是创建pod控制器deployment
- 命名:xia-deployment-nginx.yaml
apiVersion: apps/v1 # --------------------- 创建该对象所使用的 Kubernetes API 的版本
kind: Deployment # ------------------------ 对象类别:deployment
metadata:
  name: xia-nginx-deployment # ------------ deployment名字
  namespace: xia # ------------------------ 所属命令空间
  labels: # ------------------------------- 标签,( 注意区分 labels 和 namespace 的区别 )
    run: xia-nginx
spec:
  replicas: 3 # ---------------------------- pod副本数
  selector: # ----------------------------- pod选择器
    matchLabels:
      run: xia-nginx # -------------------- [ pod中的label和deployment一一对应 ] deployment所属标签,和template中的pod的标签对应表示匹配
  template: # ----------------------------- 定义 pod 模版
    metadata:
      name: xia-nginx-pod
      namespace: xia
      labels:
        run: xia-nginx # ------------------ [ pod中的label和deployment一一对应 ]
      spec:
        containers:
        - name: xia-nginx-container
          image: xia-vue
          imagePullPolicy: IfNotPresent # - 镜像拉取策略,IfNotPresent Never Alwarys
          ports:
          - containerPort: 80        
(2.2) 利用 xia-deployment-nginx.yaml 新建 deployment
- 新建deployment: kubectl create -f xia-deployment-ngnx.yaml
- 查询deployment: kubectl get deployment -n xia



(3) 
创建service
(3.1) 创建 service 的配置yaml文件
- 命名:xia-service-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: xia-nginx-service
  namespace: xia
  labels:
    run: xia-nginx
spec:
  type: NodePort
  selector: 
    run: nginx
  ports:
  - port: 77
    targetPort: 80
(3.2) 利用 xia-service-nginx.yaml 新建 service
- 新建service: kubectl create -f xia-service-nginx.yaml
- 查询service: kubectl get service -n xia

service信息如下
NAME                TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
xia-nginx-service   NodePort   10.0.0.179   <none>        77:32244/TCP   15s



(4) 
- 外网访问kubernetes中的服务
  - curl node节点ip + 端口
- 集群内部kubernetes访问
  - node节点输入:curl 10.0.0.179:77
  
 
(5)
优化:我们可以把 ( xia-deployment-nginx.yaml )  ( xia-service-nginx.yaml ) 合并成一个
  - 因为:我们两个文件执行的命令是一样的,即 kubectl create -f xxxxxx.yaml
  - 并且:yaml 规范中可以使用 --- 来分隔文件,就可以把多个资源写在同一个yaml文件中,就不用写多个

1658562604497.png

资料