当前位置: 首页 > news >正文

K8s——Service、代理模式演示(二)

Service

演示

SVC

  1. 创建svc-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
   name: myapp-deploy
   namespace: default
spec:
   replicas: 3
   selector:
     matchLabels:
       app: myapp
       release: stabel
   template:
     metadata:
       labels:
         app: myapp
         release: stabel
         env: test
     spec: 
       containers:
        - name: myapp
          image: nginx
          imagePullPolicy: IfNotPresent
          ports:
           - name: http
             containerPort: 80

vim svc.yaml

apiVersion: v1
kind: Service
metadata:
   name: myapp
   namespace: default
spec:
   type: ClusterIP
   selector:
     app: myapp
     release: stabel
   ports:
    - name: http
      port: 80
      targetPort: 80

注意:svc的selector的标签一定要全都包含在deployment的labels中
创建deploymen、svc

kubectl apply -f svc-deployment.yaml
kuebctl apply -f  svc.yaml

查看

[root@master ~]# kubectl get pod -o wide
NAME                           READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
myapp-deploy-bfd7cc44f-qcnhw   1/1     Running   0          102m   10.244.166.177   node1   <none>           <none>
myapp-deploy-bfd7cc44f-txcxf   1/1     Running   0          102m   10.244.166.176   node1   <none>           <none>
myapp-deploy-bfd7cc44f-wbrhh   1/1     Running   0          102m   10.244.104.28    node2   <none>           <none>
8    node2   <none>           <none>

查看svc

[root@apiserver ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
myapp        ClusterIP   10.102.30.82   <none>        80/TCP    39s

访问验证
通过svc IP访问pod

curl 10.102.30.82

Headless Service

有时不需要或不想要负载均衡,以及单独的 Service IP 。遇到这种情况,可以通过指定 ClusterIP(spec.clusterIP) 的值为“None”来创建 Headless Service 。这类 Service 并不会分配 Cluster IP, kube-proxy 不会处理它们,而且平台也不会为它们进行负载均衡和路由

演示

示例
创建svc-none.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: myapp-headless
  namespace: default
spec:
  selector:
    app: myapp
  clusterIP: "None"
  ports:
  - port: 80
    targetPort: 80

创建Svc

kubectl apply -f svc-none.yaml 

查看

[root@apiserver ~]# kubectl get svc
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
myapp-headless   ClusterIP   None           <none>        80/TCP    8s

查看Headles Service代理IP

#使用dig需要
yum -y install bind-utils
dig -t A myapp-headless.default.svc.cluster.local. @192.168.137.141

#解释:
myapp-headless.:svc的名字
default:命名空间
svc.cluster.local. :默认域名
@192.168.137.14 :coredns的IP

查看coredns的方法:

kubectl get pod -n kube-system
 [root@apiserver ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
coredns-6967fb4995-5fg4q                   1/1     Running   4          3d10h
coredns-6967fb4995-8v5kb                   1/1     Running   4          3d10h

连接验证

[root@apiserver ~]# dig -t A myapp-headless.default.svc.cluster.local. @192.168.137.141

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-9.P2.el7 <<>> -t A myapp-headless.default.svc.cluster.local. @192.168.137.141
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32737
;; flags: qr aa rd; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;myapp-headless.default.svc.cluster.local. IN A

;; ANSWER SECTION:
myapp-headless.default.svc.cluster.local. 30 IN	A 192.168.102.186
myapp-headless.default.svc.cluster.local. 30 IN	A 192.168.102.185
myapp-headless.default.svc.cluster.local. 30 IN	A 192.168.102.189

;; Query time: 1 msec
;; SERVER: 192.168.137.141#53(192.168.137.141)
;; WHEN: 三 1月 01 02:09:09 CST 2020
;; MSG SIZE  rcvd: 237

curl 192.168.102.189就能访问页面

NodePort

nodePort 的原理在于在 node 上开了一个端口,将向该端口的流量导入到 kube-proxy,然后由 kube-proxy 进
一步到给对应的 pod

演示

创建nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: default
spec:
  type: NodePort
  selector:
     app: myapp
     release: stabel
  ports:
   - name: http
     port: 80
     targetPort: 80

创建svc

kubectl apply -f nodeport.yaml

查看svc

[root@apiserver ~]# kubectl get  svc
NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
myapp            NodePort    10.102.30.82   <none>        80:30250/TCP   83m

访问验证
在网页上输入master或者node节点IP+30250就能访问
在这里插入图片描述

LoadBalancer

LoadBalancer和nodePort其实是同一种方式,区别在于loadBalancer比nodePort多了一步,就是可以调用cloud provider去创建LB来向节点导流。(收费服务)
在这里插入图片描述

类型ExternalName

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

演示

例如,以下 Service 定义将 prod 名称空间中的 my-service 服务映射到 hub.kxq.com:
示例:
创建
vim external.yaml

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

注意:前提必须有prod的namespace没有的话,需要先创建:
创建svc

kubectl create namespace prod

检查是否有prod这个命名空间

kubectl get namespaces
kubectl apply -f external.yaml

查看
会发现EXTERNAL-IP 以变为我修改的名字

[root@apiserver ~]# kubectl get svc -n prod
NAME             TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
my-service-1     ExternalName   <none>         hub.kxq.com   <none>         10s

dig解析查看

[root@apiserver ~]# dig -t A my-service-1.prod.hub.kxq.com. @192.168.137.141

;; ANSWER SECTION:
my-service-1.default.svc.cluster.local.	30 IN CNAME hub.kxq.com.
hub.kxq.com.		30	IN	A	199.59.241.250

相关文章:

  • 哈希表及其与Java类集的关系
  • CSS基础总结(二)
  • 《Python多人游戏项目实战》第三节 在窗口上显示玩家ID以及对话内容
  • SpringBoot【配置文件】
  • 王卫点赞友商?北京快递保卫战,顺丰彰显大格局大气度
  • 95 C语言初阶练习题
  • Class Charset
  • 深度学习目标检测:YOLOv5实现红绿灯检测(含红绿灯数据集+训练代码)
  • SpringBoot+Vue实现前后端分离的小而学在线考试系统
  • Redis常见面试题(二)
  • Servlet应用(Request+response对象)
  • 蓝桥杯嵌入式 cubeMX生成代码解读
  • 微软确认配置错误导致65,000多家公司的数据泄露
  • 冰刃(IceSword)的使用方法(基础篇)
  • 考研英语|传统文化英语高频词汇
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Brief introduction of how to 'Call, Apply and Bind'
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • k8s 面向应用开发者的基础命令
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Making An Indicator With Pure CSS
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Node + FFmpeg 实现Canvas动画导出视频
  • vagrant 添加本地 box 安装 laravel homestead
  • 番外篇1:在Windows环境下安装JDK
  • 复杂数据处理
  • 容器服务kubernetes弹性伸缩高级用法
  • 写给高年级小学生看的《Bash 指南》
  • 一、python与pycharm的安装
  • AI算硅基生命吗,为什么?
  • 积累各种好的链接
  • ​如何防止网络攻击?
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • # 安徽锐锋科技IDMS系统简介
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (13):Silverlight 2 数据与通信之WebRequest
  • (52)只出现一次的数字III
  • (C语言)逆序输出字符串
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (SpringBoot)第七章:SpringBoot日志文件
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (九)c52学习之旅-定时器
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转载)PyTorch代码规范最佳实践和样式指南
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .NET MVC第三章、三种传值方式
  • .Net 垃圾回收机制原理(二)
  • .NET导入Excel数据
  • .Net各种迷惑命名解释