首页 > 其他分享 >k8s 跨空间通讯(内外部)

k8s 跨空间通讯(内外部)

时间:2024-02-27 16:33:50浏览次数:25  
标签:内外部 通讯 svc master cheng test k8s root

四层代理

创建 ExternalName 类型的 Service

应用场景:跨名称空间访问

需求:default 名称空间下的 pod 想要访问 cheng-svc-pod名称空间下的 pod 服务

cheng-svc-pod下有一个svc服务,default想访问就要下完成的名称Service_name.svc_namespace.svc.cluster.local,名称太长不好记,后面要是删除了这个名称空间,还需要修改代码。 ExternalName相当于做了一个软链接,代码直接写软链接名称,后面修改不需要改代码,直接修改ExternalName配置就可以。

ExternalName 类型

类型为 ExternalName 的 Service 将 Service 映射到 DNS 名称,而不是典型的选择算符, 例如 my-service 或者 cassandra。你可以使用 spec.externalName 参数指定这些服务。

例如,以下 Service 定义将 prod 名字空间中的 my-service 服务映射到 my.database.example.com

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

说明:

type: ExternalName 的服务接受 IPv4 地址字符串,但将该字符串视为由数字组成的 DNS 名称, 而不是 IP 地址(然而,互联网不允许在 DNS 中使用此类名称)。 类似于 IPv4 地址的外部名称无法被 DNS 服务器解析。

如果你想要将服务直接映射到某特定 IP 地址,请考虑使用无头服务

当查找主机 my-service.prod.svc.cluster.local 时,集群 DNS 服务返回 CNAME 记录, 其值为 my.database.example.com。访问 my-service 的方式与访问其他 Service 的方式相同, 主要区别在于重定向发生在 DNS 级别,而不是通过代理或转发来完成。 如果后来你决定将数据库移到集群中,则可以启动其 Pod,添加适当的选择算符或端点并更改 Service 的 type

注意:

针对 ExternalName 服务使用一些常见的协议,包括 HTTP 和 HTTPS,可能会有问题。 如果你使用 ExternalName 服务,那么集群内客户端使用的主机名与 ExternalName 引用的名称不同。

对于使用主机名的协议,这一差异可能会导致错误或意外响应。 HTTP 请求将具有源服务器无法识别的 Host: 标头; TLS 服务器将无法提供与客户端连接的主机名匹配的证书。

服务(Service) | Kubernetes

cheng-svc-pod名称空间资源

[root@k8s-master cheng-svc-test]# kubectl -n cheng-svc-test get all
NAME                       READY   STATUS    RESTARTS   AGE
pod/nginx-cc89db96-c8hbp   1/1     Running   0          20m
pod/nginx-cc89db96-hrr75   1/1     Running   0          20m
pod/nginx-cc89db96-k4bp4   1/1     Running   0          20m

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/cheng-clusterip    ClusterIP   10.98.49.113    <none>        80/TCP         20m
service/nodeport-service   NodePort    10.105.177.35   <none>        80:30188/TCP   20m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           20m

NAME                             DESIRED   CURRENT   READY   AGE

defaulf 默认空间下创建pod

[root@k8s-master cheng-svc-test]# cat default.yaml 
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: default
  namespace: default
spec:
  replicas: 1
  selector: 
    matchLabels:
      app: busybox
  template: 
    metadata:
      labels:
        app: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh","-c","sleep 360000"]

[root@k8s-master cheng-svc-test]# 
[root@k8s-master cheng-svc-test]# kubectl get pods
NAME                       READY   STATUS    RESTARTS      AGE
busybox                    0/1     Unknown   0             19d
default-6f44df49c8-w7b8h   1/1     Running   0             27s
nginx                      1/1     Running   1 (80m ago)   19d
[root@k8s-master cheng-svc-test]# 


创建 ExternalName

[root@k8s-master ~]# kubectl  ap
api-resources  (Print the supported API resources on the server)
api-versions   (Print the supported API versions on the server, in the form of "group/version")
apply          (Apply a configuration to a resource by file name or stdin)
[root@k8s-master ~]# kubectl  api-resources 
NAME                              SHORTNAMES   APIVERSION                             NAMESPACED   KIND
bindings                                       v1                                     true         Binding
componentstatuses                 cs           v1                                     false        ComponentStatus


[root@k8s-master cheng-svc-test]# cat client_svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: client-svc
spec:
  type: ExternalName
  externalName: cheng-clusterip.cheng-svc-test.svc.cluster.local

[root@k8s-master cheng-svc-test]# 

[root@k8s-master cheng-svc-test]# kubectl apply -f client_svc.yaml 
service/client-svc created



Service_name.svc_namespace.svc.cluster.local

image-20231122161327699

image-20231122161445266

进入busybox测试

[root@k8s-master ~]# kubectl exec -it default-6f44df49c8-w7b8h -- /bin/sh
/ # wget -q -O -  cheng-clusterip.cheng-svc-test.svc.cluster.local
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
/ # wget -q -O - client-svc
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>

image-20231122161713903

pod访问k8s外部的服务器

我在k8s集群外部有一个数据库,现在pod想连接怎么实现.

首先要保证k8s宿主机要和数据库网络通。

image-20231122162258925

image-20231122162324761

创建一个mysql的svc

[root@k8s-master cheng-svc-test]# cat mysql.yaml 
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  type: ClusterIP
  ports:
  - port: 3306

[root@k8s-master cheng-svc-test]# kubectl apply -f mysql.yaml 
service/mysql created

[root@k8s-master cheng-svc-test]# kubectl get svc
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                        PORT(S)    AGE
client-svc   ExternalName   <none>           cheng-clusterip.cheng-svc-test.svc.cluster.local   <none>     22m
kubernetes   ClusterIP      10.96.0.1        <none>                                             443/TCP    19d
mysql        ClusterIP      10.100.239.193   <none>                                             3306/TCP   60s
[root@k8s-master cheng-svc-test]# 

创建一个 mysql_endpoint.yaml 文件,并在其中定义 Endpoints,指定外部 MySQL 服务的 IP 地址和端口。假设外部 MySQL 的 IP 地址为 192.168.199.224,端口为 3306:

[root@k8s-master cheng-svc-test]# cat mysql_endpoint.yaml 
apiVersion: v1
kind: Endpoints
metadata: 
  name: mysql
subsets:
- addresses:
  - ip: 192.168.199.224
  ports:
  - port: 3306

root@k8s-master cheng-svc-test]# kubectl apply -f mysql_endpoint.yaml 
endpoints/mysql created

查看mysql svc更新状态

[root@k8s-master cheng-svc-test]# kubectl describe service mysql 
Name:              mysql
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.100.239.193
IPs:               10.100.239.193
Port:              <unset>  3306/TCP
TargetPort:        3306/TCP
Endpoints:         192.168.199.224:3306
Session Affinity:  None
Events:            <none>
[root@k8s-master cheng-svc-test]# 

​ 通过以上步骤,我们成功在 Kubernetes 集群中引入了外部的 MySQL 数据库。通过创建 Service 和 Endpoints,我们将外部 MySQL 的 IP 地址和端口与集群内内的 Service 进行了关联, 使得集群内部的应用可以通过 Service 名称访问外部的 MySQL 服务。通过访问该 Service,可以使 用集群内的应用与外部的 MySQL 数据库进行交互。

在这个场景中,mysql Service 的 ClusterIP 为 10.100.239.193,它将外部 MySQL 的 IP 地 址和端(192.168.33.224:3306)暴露给集群内部的应用。 你可以在需要访问外部 MySQL 数据库的应用中,使用 mysql Service 的名称来连接数据库。通 过这种方式,你可以在 Kubernetes 集群中轻松地引用外部的 MySQL 数据库,实现集群内外数据的 交互和共享。 请注意,这种方式适用于在 Kubernetes 集群中引入已经存在的外部服务。但在实际使用中,还需 要确保网络连接和安全性的考虑,如网络可访问性、防火墙规则、身份验证等。

通过pod测试mysql数据库

[root@k8s-master cheng-svc-test]# kubectl exec -it default-6f44df49c8-w7b8h -- /bin/sh
/ # 
/ # telnet mysql 3306
telnet: bad address 'mysql'
/ # telnet 10.100.239.193 3306
Connected to 10.100.239.193
J
5.7.28}b~RIy:):WjHmysql_native_passwordConnection closed by foreign host
/ # 

标签:内外部,通讯,svc,master,cheng,test,k8s,root
From: https://www.cnblogs.com/9527com/p/18037167

相关文章

  • 在K8S中,当Pod业务量比较大时候,如何实现水平伸缩和扩容?
    在Kubernetes中,当Pod的业务量比较大时,可以通过水平伸缩(HorizontalPodAutoscaling,HPA)和扩容(Scaling)来实现动态的资源管理。以下是实现水平伸缩和扩容的一些步骤和方法:1.水平伸缩(HorizontalPodAutoscaling,HPA)水平伸缩允许你根据一些指标(如CPU使用率、内存使用率、自定义......
  • 在K8S中,worke节点启动阶段包括什么?
    在Kubernetes(K8S)中,Worker节点启动阶段大致包括以下几个关键步骤:系统初始化:Worker节点操作系统启动,加载基础系统服务和配置。安装必备软件,如Docker或containerd作为容器运行时环境。kubelet启动:kubelet是Kubernetes在每个节点上的代理程序,它会在启动时加载其配置文件(通......
  • 在K8S中,如何查看Pod中某个容器日志?
    在Kubernetes(K8s)中,若要查看Pod中某个容器的日志,可以使用kubectllogs命令,并通过-c或--container参数指定容器名称。以下是命令格式:kubectllogs<pod_name>-c<container_name>这里的<pod_name>是你想要查看日志的Pod名称,而<container_name>则是你具体想要......
  • 在K8S中,svc关联pod失败原因有哪些?
    在Kubernetes(K8S)中,Service(svc)与Pod关联失败的原因可能有多种。以下是一些常见的原因:网络问题:kube-proxy配置问题:如果kube-proxy没有正确配置或未开启masquerade,可能导致Pod发出的包无法被正确伪装成Service的IP和MAC地址,从而导致Service无法与Pod关联。网络策略限制:如果启用......
  • 在K8S中,如何知道Pod的数据存储在哪里?
    在Kubernetes(K8S)中,Pod的数据存储位置主要取决于Pod中容器挂载的卷(volume)。Pod的数据存储可以通过多种方式在Kubernetes集群中持久化或临时存储,以下是如何确定Pod数据存储位置的方法:查看PodYAML配置:检查Pod的YAML定义文件,可以明确看到容器挂载的卷类型和挂载路径。例如,查......
  • K8S 陈述式资源管理方法
    K8S陈述式资源管理方法.kubernetes集群管理集群资源的唯一入口是通过相应的方法调用apiserver的接口2.kubectl是官方的CLI命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径3.ku......
  • k8s Rollout命令
    k8s支持deployment的回滚Deployment是一种声明式的定义形式Replicaset是最直接管理Pod的资源形式通过yaml文件定义一个deployment会生成一个replicaset控制器,RS控制器会根据模板来创建PodDeployment相较于RS支持回滚和滚动升级#ReplicaSet是kubernetes中的一种副本控制器......
  • 部署K8S-1-26
    DEVops入门1部署K8S1.1节点准备节点名ip功能k8s-master10.0.0.153k8s-node110.0.0.154k8s-node210.0.0.1551.2初始操作在所有节点执行#1关闭防火墙systemctldisablefirewalldsystemctlstopfirewalldfirewall-cmd--state#2关闭seli......
  • 部署K8S-1-23
    DEVops入门1部署K8S1.1节点准备节点名ip功能k8s-master10.0.0.150k8s-node110.0.0.151k8s-node210.0.0.1521.2初始操作在所有节点执行#1关闭防火墙systemctldisablefirewalldsystemctlstopfirewalld#2关闭selinuxsed-i's/enforci......
  • k8s pod重启 deployment重启
     1.15版本之后可通过kubectlrolloutrestartdeployment-n命令来实现滚动重启POD该命令会先创建待用POD,待新POD运行成功后,再关闭原有POD。因此需要保证node节点数量大于POD数量,否则新POD无法正常启动。当POD数量与node数量相同时,可使用先减小deployment规模的方法,先减小......