扣丁狼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