一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第19天,点击查看活动详情。
一、使用命令创建服务
需求: 创建一个名为
webapp
的Deployment
,它可以创建两个Nginx Pod
副本,并且指定容器提供服务的端口号为80
端口。
- 新建
nginx-deployment.yaml
文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: myweb
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
- 执行创建
$ kubectl create -f nginx-deployment.yaml
deployment.apps/myweb created
- 查看新创建的
pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb-5754944d6c-2dfft 1/1 Running 0 18s
myweb-5754944d6c-7xr97 1/1 Running 0 18s
- 使用
kubectl expose
创建服务
命令主要用于将一个已经存在的
Pod、RC、Service、或是 Deployment
暴露为一个新的Service
# kubectl expose (-f FILENAME|TYPE NAME|TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name][--name=name][--external-ip=external-ip-of-service][--type=type][flags]
$ kubectl expose deploy myweb
service/myweb exposed
- 查看创建好的服务
直接使用命令创建,不指定额外参数的话,新建的
Service
使用与deploy
相同的名称,端口也会直接使用Pod
中定义的containerPort
。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 81d
myweb ClusterIP 10.106.77.234 <none> 80/TCP 52s
- 查找新建的两个
pod
的ip
地址,查看myweb
服务的详细信息
$ kubectl get pods -l app=nginx -o yaml|grep podIP
podIP: 10.244.3.4
podIP: 10.244.2.5
$ kubectl describe svc/myweb
# 重点关注 Endpoints,可以看到它记录了符合要求的 Pods 在集群内部的 IP 地址和端口号
- 测试
进入集群内部,测试
clusterIP:port
是否可以访问
shiyanlou:~/ $ docker exec -it kube-master bash
root@kube-master:/# curl 10.105.149.130
可以看到在通过 ClusterIP
类型的 Service
已经可以成功实现集群内部的互相访问。
二、使用 YAML
文件创建服务
- 新建
tomcat-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
selector:
matchLabels:
app: tomcat
replicas: 2
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
- 执行创建
$ kubectl create -f tomcat-deployment.yaml
deployment.apps/myapp created
- 查看新创建的
pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp-69ff6fc7c6-q5vwk 1/1 Running 0 108s
myapp-69ff6fc7c6-vwxm7 1/1 Running 0 108s
- 新建
myapp-svc.yaml
文件
设置服务类型为 NodePort,集群内部服务的端口为 8081,对外提供服务的端口为 30001,并且 pod 的端口为 8080
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
type: NodePort # 指定服务类型为 NodePort
ports:
- port: 8081 # 指定集群内部 service 的端口
targetPort: 8080 # 指定 Pod 的端口
nodePort: 30001 # 指定外部连接的端口
selector: # 标签选择器,选择带有 app=tomcat 的 Pod
app: tomcat
- 执行创建
$ kubectl create -f myapp-svc.yaml
service/myapp created
- 查看服务信息
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 82d
# 可以发现新建的 myapp 服务,类型为 NodePort;PORT 部分,8081 为集群 VIP 端口,30001 为外部连接 Node 的端口
myapp NodePort 10.98.24.238 <none> 8081:30001/TCP 7s
$ kubectl get pods -l app=tomcat -o yaml|grep podIP
podIP: 10.244.3.3
podIP: 10.244.2.4
$ kubectl describe svc/myapp
Name: myapp
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=tomcat
Type: NodePort
IP: 10.98.24.238
Port: <unset> 8081/TCP
TargetPort: 8080/TCP
NodePort: <unset> 30001/TCP
Endpoints: 10.244.2.4:8080,10.244.3.3:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
- 集群内部访问
shiyanlou:~/ $ docker exec -it kube-master bash
root@kube-master:/# curl 10.98.24.238:8081
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/8.5.47</title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
</head>
......
通过 10.192.0.2:30001
访问