baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 华仔聊技术

  • 业务设计

  • 场景设计

  • 运维

  • 安全

  • 面试

  • mac相关工具推荐

  • 开发工具

  • 人工智能

  • 推荐

  • 阅读

  • 工具

  • 计划

  • 产品

  • 云原生

  • go

  • QVM

    • OpenStack

    • K8S

      • 扣丁狼k8s(一)
      • 扣丁狼k8s(二)
        • 1. 服务发现service
          • 命令:
          • 清单编写
          • 功能1
          • 功能2
          • 功能3
        • ingress 重点
          • 安装scp学习
          • 使用:
        • 2. 存储管理
      • k8s中的网络(一)
      • k8s中的网络(二)
      • 扣丁狼k8s(三)存储与配置
      • k8s高级调度
      • k8s分享
      • 常用命令
      • k8s集群搭建
      • 搭建过程bug记录
      • 什么是k8s的CRD
      • OpenStack Kubernetes kubevirt
      • k8s-go-client
      • kubeconfig详解
    • kubevirt

  • 软件设计师

  • 极客时间

  • 单元测试

  • 其他
  • QVM
  • K8S
xugaoyi
2023-08-30
目录

扣丁狼k8s(二)

# 1. 服务发现service

service、endpoints、pod之间的关系

image-20230830161826983

现在有两个节点node1和node2,里面都有相应的镜像容器nginx和pause。对于pause容器,会对pod内部的网络进行一个统一管理。

那么不在同一个网络里的node1和node2,应该怎么进行管理呢?此时就会用到service,service会管理对应的endpoint,endpopint中有对应的服务地址关系表,当我们的node1想要对node2进行通信的时候,我们的node1先会发送到endpoint,然后再由endpoint转发到node2.

# 命令:

kubectl get svc

kubectl describe svc -o wide

# 清单编写

image-20230830163204957

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx-deploy  # 匹配哪些pod会被该service进行代理
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP  #是绑定在Node上面的
1
2
3
4
5
6
7
8
9
10
11
12

type有4种类型:

  • ClusterIp

只能在集群内部使用,不配置类型的话默认就是ClusterIp。只是东西流量

  • ExternalName

返回定义的CNAME别名和,可以配置为域名

  • NodePort

(随机开启一个端口进行映射,该端口是直接绑定在node上的,且集群中的每一个node都会绑定在这个端口【相当于可以将pod服务暴露给外部进行访问,但是实际生产不会使用,效率较低,而且是四层负载】)

NodePort 是一种 Service 类型,它允许你将应用程序暴露到集群节点的特定端口上。当你创建一个 NodePort 类型的 Service 时,Kubernetes 会在每个节点上打开一个随机的端口,然后将该端口映射到 Service 中定义的目标端口(通常是 Pod 中容器的端口)。这样,你可以通过访问集群节点的 IP 地址和映射的端口来访问 Service。

举个例子,如果你创建了一个 NodePort 类型的 Service,并将目标端口设置为 80,Kubernetes 会为每个节点打开一个随机的端口(比如 30000-32767 范围内的端口),然后将该端口映射到 Pod 中容器的 80 端口。这样,你可以通过访问任何节点的 IP 地址和映射的端口(例如 http://node-ip:node-port)来访问 Service 中的应用程序。

image-20230831111348954

  • LoadBalancer

使用云服务商提供的负载均衡器服务

  • 相关命令

kubectl get svc

kubectl describe svc nginx-svc 查看svc的详细信息

image-20230831101844948

其中endpoints表示代理到的节点【endpoint是根据selector来实现的】

kubectl get po -o wide

image-20230831102047060

我们查看详细信息,可以看到具体代理到的节点就是我们对应pod的ip

kubectl exec -it busybox -- sh curl http://nginx-svc 创建其他pod通过service name进行访问(推荐)

image-20230831102319412

这里我们就基于我们的服务名访问到了nginx,而且我们看到的这个ip是nginx-service

# 功能1

是怎么运作的呢?

通过kubectl找到了server-api,再通过server-api找到对应的service,再通过service找到挂在的nginx。

通过wget在本地的iptables找到service

image-20230831103353511

当然,跨命名空间也是可以访问的,可以在servicename的后面加上对应的命名空间的名字:例如http://nginx-service.default 也可以.

# 功能2

以上都是实现的集群内部的各个pod之间通过服务名进行访问,那可以实现集群内部pod访问k8s集群外的其他服务吗?【理解:内部的pod是可以访问互联网,比如访问www.baidu.com,这个是可以的。但是如果是我们自己的mysql服务,这时候我们就需要在pod的java项目里面写上对应的ip。但是肯定不能写ip吧,我们希望写一个服务名,这样以后ip地址变了,但是服务名就不用更改,现在我们的需求就是通过服务名,pod能不能访问到集群外部的服务】

实现具体方式

  1. 编写service配置文件时,不指定selector属性
  2. 自己来创建endpoint配置【为什么自己创建endpoint呢,因为当使用selector时,自动创建的是内部ip与服务名的绑定,现在我们想让外部ip与服务名绑定,我们需要自己写endpoint才行】

image-20230831105001969

创建成功后,我们可以通过kubectl get svc kubectl get ep 查看相应的信息

然后会发现,我们新创建的svc没有对应的ep,所以我们这个时候来创建对应的ep

ep也是一种对应的资源,也需要写相应的yaml文件

image-20230831105548475

然后进行创建,然后我们查看详细信息,就可以对应了。

测试,进入pod容器,使用wget http://nginx-svc-external, 就可以访问成功

image-20230831110000700

# 功能3

上面说的我们配置的事ip地址,那我们可以直接配置一个外网的域名吗?答案是可以的

image-20230831110841962

apiVersion: v1
kind: Service
metadata:
  labels:
    app: toBaidu
  name: baidu-service
spec:
  type: ExternalName
  externalName: www.baidu.com
1
2
3
4
5
6
7
8
9

# ingress 重点

image-20230831112059266

其实这里的 Ingress 可以类比为nginx,可以想向城对nginx做了一层封装。Ingress依赖了nginx。

image-20230831112622638

image-20230831112702858

是七层协议

# 安装scp学习 (opens new window)

https://kubernetes.feisky.xyz/extension/ingress

  1. 安装helm管理

image-20230831112954932

wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz

  1. 移动

cp -r helm /usr/local/bin/

  1. helm version

添加helm仓库

helm repo add ingress-nginx http://kubernetes.github.io/ingress-nginx
1

查看仓库列表

helm repo list
1

搜索ingress-nginx

helm search repo ingress-nginx
1

image-20230831124837275

下载

helm pull ingress-nginx/ingress-nginx
1

解压:

tar -zxvf ingress-nginx-4.7.1.tgz

更改镜像:values.yaml

image-20230831134355585

registry: registry.cn.hangzhou.aliyuncs.com
image: google_containers/nginx-ingress-controller
注释掉hash校验


registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/kube-webhook-certgen


hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet


修改部署配置 kind: DaemonSet
nodeSelector:
 ingress: "true" 
 
 
将admissionWebhooks.enable修改为false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

image-20230831154033827

image-20230831154759393

以上更改配置非常复杂:

  1. 创建integress专属的命名空间
kubectl create ns ingress-nginx
1
  1. Kubectl get ns

  2. 为需要部署的ingress的节点上加上标签

kubectl label no minikube ingress=true

查看节点信息:

kubectl get nodes

kubectl get nodes --show-labels

  1. 安装 ingress-nginx
helm install ingress-nginx -n ingress-nginx .
1

image-20230831162846340

  1. 查看对应的命名空间是否已经建立了对应的节点

kubectl get po -n ingress-nginx

上面可能在集群模式下才会有效果,现在我们在minikube上,使用官方文档的方式试一试

https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/ingress-minikube/

# 使用:

创建对应的ingress文件

image-20230831172940616

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: baidu-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: 122.228.207.18
    http:
      path: 
      - pathType: Prefix
        backend:
          name: nginx-svc
          port:
            number: 80     
        path: /api
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

创建成功后,我们就是用kubectl get ingress 的方式来获取数据

image-20230831173305148

Kubernetes Ingress 是一种资源对象,它充当了在集群中管理外部访问的 API 网关的角色。Ingress 允许你定义如何将外部请求路由到你的服务,通常用于 HTTP 和 HTTPS 请求。

以下是 Ingress 的一些关键特性和作用:

  1. 路由外部流量:Ingress 允许你将外部流量路由到集群中的不同服务。你可以基于请求的主机名、路径、HTTP 头等标准来定义路由规则。
  2. SSL/TLS 终止:Ingress 支持 SSL/TLS 终止,这意味着你可以在 Ingress 上配置 TLS 证书,用于加密外部访问的流量。
  3. 负载均衡:Ingress 可以与底层负载均衡器(通常由云提供商管理)集成,以分发外部流量到不同的后端服务。
  4. 多域名和虚拟主机:你可以配置一个 Ingress 对象来处理多个域名(虚拟主机)的流量,将不同的域名路由到不同的服务。
  5. 路径和前缀路由:Ingress 具有强大的路径和前缀路由功能,允许你基于请求的 URL 路径将流量路由到不同的服务。
  6. 灵活性:Ingress 是一个高度可配置的资源,你可以根据你的需求定制路由规则,允许你实现高度定制化的流量控制。
  7. 集中管理:通过 Ingress,你可以在一个集中的位置管理所有入口流量,而无需为每个服务单独配置外部访问规则。

请注意,Ingress 控制器是需要安装和配置的,它负责实际的路由和负载均衡功能。Kubernetes 社区提供了多个 Ingress 控制器的实现,如 Nginx Ingress Controller、Traefik、HAProxy Ingress 等,你可以根据你的需求选择并安装适合的控制器。

# 2. 存储管理

image-20230831181032113

ConfigMap存储一些明文的配置

secret中可以存储一些加密的信息

# 创建configMap
kubectl create configmap

Examples:
  # Create a new config map named my-config based on folder bar
  kubectl create configmap my-config --from-file=path/to/bar
  
  # Create a new config map named my-config with specified keys instead of file basenames on disk
  kubectl create configmap my-config --from-file=key1=/path/to/bar/file1.txt --from-file=key2=/path/to/bar/file2.txt
  
  # Create a new config map named my-config with key1=config1 and key2=config2
  kubectl create configmap my-config --from-literal=key1=config1 --from-literal=key2=config2
  
  # Create a new config map named my-config from the key=value pairs in the file
  kubectl create configmap my-config --from-file=path/to/bar
  
  # Create a new config map named my-config from an env file
  kubectl create configmap my-config --from-env-file=path/to/foo.env --from-env-file=path/to/bar.env
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
编辑 (opens new window)
上次更新: 2024/02/22, 14:03:19
扣丁狼k8s(一)
k8s中的网络(一)

← 扣丁狼k8s(一) k8s中的网络(一)→

最近更新
01
spark基础
02-22
02
mysql读写分离和分库分表
02-22
03
数据库迁移
02-22
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式