导航
[封装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,宕机后整个服务将不能正常运行
- 适用:只适合 - 测试环境
- 多主多从
- 优点:安全性高,适合生产环境
(二) 资源管理
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来指定
(三) 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 表示容器
(五) 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
(七) 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文件中,就不用写多个
资料
- xshell下载地址:www.xshell.com/zh/xshell/
- kubectl常用命令:juejin.cn/post/684490…
- kubectl部署nginx服务 juejin.cn/post/696828…