扣丁狼k8s(二)
  # 1. 服务发现service
service、endpoints、pod之间的关系

现在有两个节点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
# 清单编写

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上面的
 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 中的应用程序。
- LoadBalancer
 
使用云服务商提供的负载均衡器服务
- 相关命令
 
kubectl get svc
kubectl describe svc nginx-svc 查看svc的详细信息

其中endpoints表示代理到的节点【endpoint是根据selector来实现的】
kubectl get po -o wide

我们查看详细信息,可以看到具体代理到的节点就是我们对应pod的ip
kubectl exec -it busybox -- sh curl http://nginx-svc 创建其他pod通过service name进行访问(推荐)

这里我们就基于我们的服务名访问到了nginx,而且我们看到的这个ip是nginx-service
# 功能1
是怎么运作的呢?
通过kubectl找到了server-api,再通过server-api找到对应的service,再通过service找到挂在的nginx。
通过wget在本地的iptables找到service

当然,跨命名空间也是可以访问的,可以在servicename的后面加上对应的命名空间的名字:例如http://nginx-service.default 也可以.
# 功能2
以上都是实现的集群内部的各个pod之间通过服务名进行访问,那可以实现集群内部pod访问k8s集群外的其他服务吗?【理解:内部的pod是可以访问互联网,比如访问www.baidu.com,这个是可以的。但是如果是我们自己的mysql服务,这时候我们就需要在pod的java项目里面写上对应的ip。但是肯定不能写ip吧,我们希望写一个服务名,这样以后ip地址变了,但是服务名就不用更改,现在我们的需求就是通过服务名,pod能不能访问到集群外部的服务】
实现具体方式
- 编写service配置文件时,不指定selector属性
 - 自己来创建endpoint配置【为什么自己创建endpoint呢,因为当使用selector时,自动创建的是内部ip与服务名的绑定,现在我们想让外部ip与服务名绑定,我们需要自己写endpoint才行】
 

创建成功后,我们可以通过kubectl get svc kubectl get ep 查看相应的信息
然后会发现,我们新创建的svc没有对应的ep,所以我们这个时候来创建对应的ep
ep也是一种对应的资源,也需要写相应的yaml文件

然后进行创建,然后我们查看详细信息,就可以对应了。
测试,进入pod容器,使用wget http://nginx-svc-external, 就可以访问成功

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

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

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


是七层协议
# 安装scp学习 (opens new window)
https://kubernetes.feisky.xyz/extension/ingress
- 安装helm管理
 

wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
- 移动
 
cp -r helm /usr/local/bin/
helm version
添加helm仓库
helm repo add ingress-nginx http://kubernetes.github.io/ingress-nginx
 查看仓库列表
helm repo list
 搜索ingress-nginx
helm search repo ingress-nginx
 
下载
helm pull ingress-nginx/ingress-nginx
 解压:
tar -zxvf ingress-nginx-4.7.1.tgz
更改镜像:values.yaml

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
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


以上更改配置非常复杂:
- 创建integress专属的命名空间
 
kubectl create ns ingress-nginx
 Kubectl get ns为需要部署的ingress的节点上加上标签
kubectl label no minikube ingress=true
查看节点信息:
kubectl get nodes
kubectl get nodes --show-labels
- 安装 ingress-nginx
 
helm install ingress-nginx -n ingress-nginx .
 
- 查看对应的命名空间是否已经建立了对应的节点
 
kubectl get po -n ingress-nginx
上面可能在集群模式下才会有效果,现在我们在minikube上,使用官方文档的方式试一试
https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/ingress-minikube/
# 使用:
创建对应的ingress文件
 
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
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
创建成功后,我们就是用kubectl get ingress 的方式来获取数据

Kubernetes Ingress 是一种资源对象,它充当了在集群中管理外部访问的 API 网关的角色。Ingress 允许你定义如何将外部请求路由到你的服务,通常用于 HTTP 和 HTTPS 请求。
以下是 Ingress 的一些关键特性和作用:
- 路由外部流量:Ingress 允许你将外部流量路由到集群中的不同服务。你可以基于请求的主机名、路径、HTTP 头等标准来定义路由规则。
 - SSL/TLS 终止:Ingress 支持 SSL/TLS 终止,这意味着你可以在 Ingress 上配置 TLS 证书,用于加密外部访问的流量。
 - 负载均衡:Ingress 可以与底层负载均衡器(通常由云提供商管理)集成,以分发外部流量到不同的后端服务。
 - 多域名和虚拟主机:你可以配置一个 Ingress 对象来处理多个域名(虚拟主机)的流量,将不同的域名路由到不同的服务。
 - 路径和前缀路由:Ingress 具有强大的路径和前缀路由功能,允许你基于请求的 URL 路径将流量路由到不同的服务。
 - 灵活性:Ingress 是一个高度可配置的资源,你可以根据你的需求定制路由规则,允许你实现高度定制化的流量控制。
 - 集中管理:通过 Ingress,你可以在一个集中的位置管理所有入口流量,而无需为每个服务单独配置外部访问规则。
 请注意,Ingress 控制器是需要安装和配置的,它负责实际的路由和负载均衡功能。Kubernetes 社区提供了多个 Ingress 控制器的实现,如 Nginx Ingress Controller、Traefik、HAProxy Ingress 等,你可以根据你的需求选择并安装适合的控制器。
# 2. 存储管理

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
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
