栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

运维(34) K8s使用

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

运维(34) K8s使用

文章目录
      • 一、前言
      • 二、资源创建
        • 1、命令行
        • 2、配置文件
        • 3、可视化界面
      • 三、命名空间
        • 1、命令行
        • 2、配置文件
      • 四、Pod
        • 1、命令行
        • 2、配置文件
        • 3、`Kubernetes Dashboard`可视化界面中操作
      • 五、Deployment
        • 1、多副本
          • a、命令行
          • b、配置文件
          • c、`Kubernetes Dashboard`可视化界面中操作
        • 2、扩缩容
          • 方式1
          • 方式2
          • 方式3
        • 3、自愈&故障转移
        • 4、滚动更新
        • 5、版本回退
        • 6、其它工作负载
      • 六、Service
            • 命令行
            • 配置文件
        • 1、ClusterIP
          • a、命令行
          • b、配置文件
        • 2、NodePort
          • a、命令行
          • b、配置文件
      • 七、Ingress
        • 1、安装
        • 2、使用
          • a、域名访问
          • b、路径重写
          • c、流量限制
      • 八、存储抽象
        • 1、环境准备
          • a、所有节点
          • b、主节点
          • c、从节点
          • d、原生方式数据挂载
        • 2、 PV&PVC -- 挂载目录
          • a、创建pv池
          • b、PVC创建与绑定
        • 3、ConfigMap -- 挂载配置文件
          • 1、将配置文件创建为配置集
          • 2、创建Pod
          • 3、查看
          • 4、修改ConfigMap
          • 5、检查配置是否更新
        • 4、Secret -- 保存密码等敏感数据

一、前言
  1. 运维(5) Windows10专业版安装K8s
  2. 运维(29) CentOS7.6通过KubeOperator部署Kubernetes集群
  3. 运维(33) CentOS7.6通过Kubeadm部署Kubernetes集群

可参考 https://www.yuque.com/leifengyang/oncloud/ctiwgo

二、资源创建 1、命令行
# ex:
# kubectl create ns hello
2、配置文件
# ex:
# kubectl apply -f xxx.yaml
3、可视化界面

三、命名空间

隔离资源

1、命令行
# 查看命名空间
kubectl get ns

# 查看默认命名空间`default`下的应用 -- 如果操作不指定命名空间,默认都是放在`default`命名空间下
kubectl get pods
# 查看所有命名空间下的应用
kubectl get pods -A
# 查看指定命名空间`xxx`下的应用
kubectl get pods -n xxx

# 创建命名空间 `zhengqingya`
kubectl create ns zhengqingya
# 删除 -- 会将其下所有应用删除
kubectl delete ns zhengqingya

2、配置文件
cat < 
四、Pod 

运行中的一组容器,Pod是kubernetes中应用的最小单位。

1、命令行
# 创建一个叫 `mynginx` 的 `nginx` 容器
kubectl run mynginx --image=nginx

# 查看`default`空间的Pod
kubectl get pod

# 如果应用未运行,可查看描述信息,看看应用执行相关事件处理
# kubectl describe pod Pod名
kubectl describe pod mynginx

# 删除
kubectl delete pod mynginx

# 查看运行日志
kubectl logs -f mynginx

# 输出更完善的信息 -- 每个Pod,k8s都会分配一个ip   集群中的任意机器都能访问
kubectl get pod -owide

# 查看
curl 10.0.169.136:80

# 进入容器
kubectl exec -it mynginx -- /bin/bash

2、配置文件
cat < 

一个Pod部署多个容器

tips: 无法部署多个相同容器,会出现端口占用问题!

cat < 

3、Kubernetes Dashboard可视化界面中操作

切换到指定命名空间下 -> + -> 输入并创建

查看日志

五、Deployment

控制Pod,使Pod拥有多副本,自愈,扩缩容等能力

kubectl create deployment my-dep-nginx --image=nginx


# 新开一个窗口:每隔1秒运行 查看数据
watch -n 1 kubectl get pod


# 删除应用
kubectl delete pod my-dep-nginx-xxx

# 然后在新开的窗口查看应用会自己在删除后 再次启动   =>   自愈能力
# 下面方式创建的应用删除后不会自自启动
kubectl run mynginx --image=nginx
kubectl delete pod mynginx


# 查看部署
kubectl get deploy
# 删除部署`my-dep-nginx`
kubectl delete deploy my-dep-nginx

1、多副本 a、命令行
# 启动3份副本,会在工作机器中随机部署      ex: 机器1部署2份  机器2部署1份  如果其中一个应用蹦了,会再随机启动一个,保证存在3个副本
kubectl create deployment my-dep-nginx --image=nginx --replicas=3

b、配置文件
# 删除命令行部署的`my-dep-nginx`
kubectl delete deploy my-dep-nginx


cat < 
c、Kubernetes Dashboard可视化界面中操作 

切换到指定命名空间下 -> + -> 从表单创建

2、扩缩容 方式1
# 将之前部署的3份 扩展到 5份
kubectl scale deploy/my-dep-nginx --replicas=5
# 缩容
kubectl scale deploy/my-dep-nginx --replicas=2

# 查看
kubectl get pod

方式2
# 修改 `replicas` 值 即可
kubectl edit deploy my-dep-nginx

# 查看
kubectl get pod

方式3

Kubernetes Dashboard可视化界面中操作

3、自愈&故障转移

以下情况

  1. 停止容器
  2. 删除Pod
  3. 容器崩溃
  4. 宕机

其下的应用会再自启动一份到集群下任意工作机器 => 自愈&故障转移

# 模拟:在工作机器上停掉应用
docker stop xxx

# 监控 -- 展示应用的状态变化过程
kubectl get pod -w

4、滚动更新

上次部署版本v1;这次部署版本v2,会先启动v2版本的新应用,等新应用启动成功之后,再杀死旧应用v1。

kubectl create deployment my-dep-nginx --image=nginx --replicas=2

# 部署新版本
kubectl set image deploy/my-dep-nginx nginx=nginx:1.21.6 --record

# 查看变更进度
kubectl rollout status deploy/my-dep-nginx

5、版本回退

v2版本回退到v1版本

# 历史记录
kubectl rollout history deployment/my-dep-nginx
# 查看某个历史详情
kubectl rollout history deployment/my-dep-nginx --revision=2

# 回滚 -- 上次
kubectl rollout undo deploy/my-dep-nginx
# 回滚 -- 指定版本
kubectl rollout undo deploy/my-dep-nginx --to-revision=1

# 监控 -- 展示应用的状态变化过程
kubectl get pod -w

# 查看是否回退到之前版本 -- 看image镜像版本确认
kubectl get deploy/my-dep-nginx -oyaml | grep image


6、其它工作负载

https://kubernetes.io/zh/docs/concepts/workloads/controllers

  1. Deployment: 无状态应用部署 ex: 微服务
  2. StatefulSet: 有状态应用 ex: redis
  3. DaemonSet: 守护型应用部署 ex: 日志收集组件
  4. Job: 定时任务部署 ex: 垃圾清理组件
六、Service

将一组Pods公开为网络服务的抽象方法;Pod的服务发现与负载均衡。

命令行
# 暴露Deploy  => 将目标服务端口80暴露为8000
kubectl expose deploy my-dep-nginx --port=8000 --target-port=80

# 查看已暴露的服务
kubectl get service

# 访问 -- ip方式
curl 10.96.23.211:8000

# 访问 -- service域名方式
# 进入容器 curl 服务名.命名空间.svc:8000
curl my-dep-nginx.default.svc:8000

# 删除已暴露的服务
kubectl delete service my-dep-nginx

# 使用标签检索Pod
kubectl get pod -l app=my-dep-nginx


配置文件
cat < 
1、ClusterIP 

用于集群内部访问

a、命令行
# 等同于没有`--type`,即上面方式
kubectl expose deploy my-dep-nginx --port=8000 --target-port=80 --type=ClusterIP
# 删除
kubectl delete service my-dep-nginx
b、配置文件
cat < 
2、NodePort 

用于集群外部访问,NodePort范围在 30000-32767 之间

a、命令行
kubectl expose deploy my-dep-nginx --port=8000 --target-port=80 --type=NodePort
# 删除
kubectl delete service my-dep-nginx

访问:http://集群任意IP:端口

b、配置文件
cat < 
七、Ingress 

Service的统一网关入口
https://kubernetes.io/zh/docs/concepts/services-networking/ingress
https://github.com/kubernetes/ingress-nginx

1、安装
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/baremetal/deploy.yaml

# 修改镜像 
# image: k8s.gcr.io/ingress-nginx/controller:v0.46.0@sha256:52f0058bed0a17ab0fb35628ba97e8d52b5d32299fbc03cc0f6c7b9ff036b61a
# 变更为
# image: registry.cn-hangzhou.aliyuncs.com/zhengqing/ingress-nginx-controller:v0.46.0
vim deploy.yaml

# 创建
kubectl apply -f deploy.yaml

# 查看安装是否安装完成
kubectl get pod -A

# 检查安装的结果
kubectl get pod,svc -n ingress-nginx

# 安装完成之后,查看Service暴露端口
kubectl get svc -A

访问

  1. https://集群任意IP:32248
  2. http://集群任意IP:31424

2、使用

准备测试环境

cat < 
a、域名访问 

cat < 

访问

hosts域名切换工具 https://github.com/oldj/SwitchHosts

  1. foo.bar.com:31424 => service1
  2. bar.foo.com:31424 => service2 – ingress层返回404
  3. bar.foo.com:31424/nginx => service2 – nginx层返回404

b、路径重写

https://kubernetes.github.io/ingress-nginx/examples/rewrite

cat < 

访问 bar.foo.com:31424/nginx => bar.foo.com:31424 即访问nginx根路径

c、流量限制

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting

cat < 

频繁访问 limit.ingress.com:31424 会出现503

八、存储抽象

以NFS作为存储层为例
节点之间互相同步数据

1、环境准备 a、所有节点
# 所有机器安装
yum install -y nfs-utils
b、主节点
# nfs主节点
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data

# 设置开机自启 & 现在启动  -- 远程绑定服务
systemctl enable rpcbind --now

# nfs服务
systemctl enable nfs-server --now

# 配置生效
exportfs -r

# 查看
exportfs

c、从节点
# 查看远程机器有哪些目录可以同步 -- 使用master机器ip地址
showmount -e 192.168.101.20

# 执行以下命令挂载 nfs 服务器上的共享目录到本机路径
mkdir -p /nfs/data

# 同步远程机器数据
mount -t nfs 192.168.101.20:/nfs/data /nfs/data

测试

# 在任意机器写入一个测试文件
echo "hello nfs server" > /nfs/data/test.txt

# 在其它机器查看数据
cat /nfs/data/test.txt
d、原生方式数据挂载

master机器执行

# 先创建共享目录
mkdir -p /nfs/data/nginx-pv

cat < /nfs/data/nginx-pv/index.html

tips: 如果删除服务,挂载的数据是不会删除的!

# 删除
kubectl delete -f nginx-nfs.yaml

# 查看挂载数据
cat /nfs/data/nginx-pv/index.html
2、 PV&PVC – 挂载目录
  1. PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置 ex: /nfs/data/nginx-pv
  2. PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格 ex: 申请10MB

ex: pv01给10MB pv02给1GB pv03给3GB;

  1. 静态供应: 提前申请创建,而非要多大就动态创建多大。
  2. 当一个pvc来申请10MB的时候,会给一个pv01的合适空间,而不是给pv02。
  3. 如果删除pod和其下pvc时,关联pv01空间也会被回收。
  4. 如果之后内容增长超过pv0x规定的空间大小将会报错。
a、创建pv池

master机器执行

# nfs主节点创建3个文件夹
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

创建PV

cat < 

b、PVC创建与绑定

master机器执行

创建PVC

cat < 

创建Pod绑定PVC

cat < /nfs/data/03/index.html


3、ConfigMap – 挂载配置文件

抽取应用配置,并且可以自动更新。
redis示例

1、将配置文件创建为配置集
# 创建redis配置文件
cat < 

apiVersion: v1
data: # data是所有真正的数据
  redis.conf: |       # key:默认是文件名
    appendonly yes    # value:配置文件的内容
kind: ConfigMap
metadata:
  name: redis-conf
  namespace: default
2、创建Pod
cat < 

3、查看
kubectl exec -it redis -- /bin/bash
cat /redis-master/redis.conf

4、修改ConfigMap
kubectl edit cm redis-conf

5、检查配置是否更新

等一会儿查看配置,发现会自动将配置同步过来

kubectl exec -it redis -- /bin/bash
cat /redis-master/redis.conf

# 此配置需要redis重启之后才会生效 -- 原因:redis中间件自身无此配置热更新功能
redis-cli
127.0.0.1:6379> CONFIG GET appendonly
127.0.0.1:6379> CONFIG GET requirepass 


4、Secret – 保存密码等敏感数据

Secret 对象类型用来保存敏感信息,ex:密码、OAuth令牌、SSH密钥。

# 命令格式
kubectl create secret docker-registry docker-secret-zhengqingya 
    --docker-server=镜像仓库服务器 
    --docker-username=用户名 
    --docker-password=密码 
    --docker-email=邮箱地址

# ex:
kubectl create secret docker-registry docker-secret-zhengqingya 
    --docker-server=registry.cn-hangzhou.aliyuncs.com 
    --docker-username=zhengqingya 
    --docker-password=xxx 
    --docker-email=xxx@qq.com
  
# 查看
kubectl get secret
kubectl get secret docker-secret-zhengqingya -oyaml

# 对密码进行base64解密查看
echo 'emhxxxnLg==' | base64 --decode

测试

cat < 

今日分享语句:
生活可以是甜的,也可以是苦的,但不能是没味的。你可以胜利,也可以失败,但你不能屈服。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/826721.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号