参考文档:https://feisky.xyz/kubernetes-handbook/concepts/service.html
****
Service 有四种类型:
* ClusterIP:默认类型,自动分配一个仅供集群内部可以访问的虚拟 IP。
* NodePort:可以让集群外访问 pod,可以通过`<NodeIP>:NodePort`来访问。
* LoadBalancer:这需要云服务提供商提供一个外部的负载均衡器,并将请求转发到`<NodeIP>:NodePort`。
* ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)。需要 kube-dns 版本在 1.7 以上。
这里我部署了 3 个副本的 tomcat6,它们目前是不能被访问到的,需要配合 Service 才能。
```shell
# cat tomcat6-dep02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: tomcat6-dep02
name: tomcat6-dep02
spec:
replicas: 3 #3个副本
selector:
matchLabels:
app: tomcat6-dep02
template:
metadata:
labels:
app: tomcat6-dep02
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
ports:
- containerPort: 8080
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE ...
tomcat6-dep02-86d9567d55-76cww 1/1 Running 0 3m23s 10.244.1.24 k8s-node1 ...
tomcat6-dep02-86d9567d55-dj6cp 1/1 Running 0 3m23s 10.244.1.25 k8s-node1 ...
tomcat6-dep02-86d9567d55-phgxm 1/1 Running 0 3m23s 10.244.2.18 k8s-node2 ...
```
<br/>
[TOC]
# 1. ClusterIP
```shell
【1】生成 Service 模板
# kubectl expose deployment tomcat6-dep02 \
--port=8080 \
--target-port=8080 \
--type=ClusterIP \
--dry-run=client -o yaml > tomcat6-svc01.yaml
【2】
# vim tomcat6-svc01.yaml
apiVersion: v1
kind: Service #类型为Service
metadata:
labels:
app: tomcat6-svc01
name: tomcat6-svc01
spec:
ports:
- port: 8080 #Service的端口
protocol: TCP
targetPort: 8080 #Pod的端口
selector:
app: tomcat6-dep02 #绑定的Deployment
type: ClusterIP #类型为ClusterIP,这是默认的,不指定也可以
```
![](https://img.kancloud.cn/db/dd/dbdd1e80c6ad5e0c9b5f878f66a54947_1821x751.png)
```shell
【3】应用 Service
# kubectl apply -f tomcat6-svc01.yaml
【4】查看 svc。10.104.49.211 就是 Service 的 IP、8080 就是 Service 的端口
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat6-svc01 ClusterIP 10.104.49.211 <none> 8080/TCP 4m21s
【5】集群内访问测试,在任意节点使用:<ClusterIP>:Port
# curl 10.104.49.211:8080
```
![](https://img.kancloud.cn/84/ad/84ad405cfcec6250b62c50feecf305fd_2139x846.png)
如果在集群外访问是不行的:
![](https://img.kancloud.cn/e8/8e/e88e10a5055948721f7d0ba566c5319f_1930x595.png)
<br/>
# 2. NodePort
**1. 部署 Service**
```shell
【1】生成 Service 模板
# kubectl expose deployment tomcat6-dep02 \
--port=8080 \
--target-port=8080 \
--type=NodePort \
--dry-run=client -o yaml > tomcat6-svc02.yaml
【2】
# vim tomcat6-svc02.yaml
apiVersion: v1
kind: Service #类型为Service
metadata:
labels:
app: tomcat6-svc02
name: tomcat6-svc02
spec:
ports:
- port: 8080 #Service的端口
protocol: TCP
targetPort: 8080 #Pod的端口
selector:
app: tomcat6-dep02 #绑定的Deployment
type: NodePort #类型指定为NodePort
```
![](https://img.kancloud.cn/db/dd/dbdd1e80c6ad5e0c9b5f878f66a54947_1821x751.png)
```shell
【3】应用 Service
# kubectl apply -f tomcat6-svc02.yaml
【4】查看 NodePort 端口,30553 就是 NodePort 端口
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat6-svc02 NodePort 10.109.199.122 <none> 8080:30553/TCP 16m
```
<br/>
**2. 通过`<NodeIP>:NodePort`集群外即可访问集群内的 Pod**
浏览器访问:http://192.168.1.18:30553/
![](https://img.kancloud.cn/23/d1/23d1bebfa714f358b564a6fbedc223c4_2118x564.png)
- K8s是什么
- K8s特点
- K8s功能
- 为什么用容器
- K8s集群搭建
- 1. 集群架构
- 2. 机器初始化
- 3. 安装Docker
- 4. 配置k8s镜像仓库
- 5. 安装k8s核心工具
- 6. 初始化主节点
- 7. node节点加入集群
- 8. 安装Pod网络插件
- 9. 测试k8s集群
- yaml资源文件
- yaml文件作用
- yaml文件编辑语法
- 资源清单描述方法
- 命令行工具kubectl
- kubectl是什么
- kubectl命令语法
- Pod
- Pod是什么
- Pod特征
- Pod定义
- Pod基本操作
- Pod分类
- Pod生命周期
- Pod重启策略
- 镜像拉取策略
- 资源限制
- 健康检查
- Label
- Namespace
- ReplicationController
- ReplicaSet
- Deployment
- HorizontalPodAutoscaler
- Service
- Service是什么
- 应用Service
- Ingress
- Ingress是什么
- 部署ingress-nginx
- Helm
- Helm是什么
- Volume
- Volume是什么
- NFS的使用
- PV与PVC
- PV与PVC是什么
- PV与PVC的使用
- ConfigMap
- ConfigMap是什么
- ConfigMap创建
- ConfigMap使用
- ConfigMap热更新
- 滚动更新Pod
- Secret
- Secret作用
- Secret类型