
#创建一个web [root@master ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created [root@master ~]# #把web应用暴露出去 [root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed [root@master ~]# #外部客户通过server来访问web的应用,这就是service存在的意义 [root@master ~]# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-f89759699-52lfr 0/1 ContainerCreating 0 36s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/nginx NodePort 10.102.12.94 <none> 80:30002/TCP 8s [root@master ~]#


[root@master ~]# cat java-demo2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-demo2
spec:
replicas: 2 #当deployment中有多个容器时,外部客户端要访问deployment的应用
selector: #就需要通过service,这时的service就相当于一个loadblance
matchLabels:
app: java-demo
project: blog
template:
metadata:
labels:
app: java-demo
project: blog
spec:
containers:
- image: lizhenliang/java-demo
imagePullPolicy: Always
name: web
ports:
- containerPort: 80
[root@master ~]#


[root@master ~]# cat deployment4.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-demo2 #deployment的名称是java-demo2
spec:
replicas: 3
selector:
matchLabels:
project: blog
app: java-demo #deployment中的project/app的值要与pod中一样
template: #否则无法匹配到该Pod
metadata:
labels:
project: blog
app: java-demo
spec:
containers:
- name: web
image: lizhenliang/java-demo
ports:
- containerPort: 80
[root@master ~]#
[root@master ~]# cat service4.yaml
apiVersion: v1 #service的版本
kind: Service #资源的类型
metadata:
name: java-demo2 #一般与deploy名称一样
spec:
selector: #通过标签选择器来匹配deploy中的pod,名为java-demo2的service对应
project: blog #的pod就是名为java-demo2中的depmloyemnt中的三个pod,这三个pod的
app: java-demo #地址为 10.244.1.156:8080,10.244.2.234:8080,10.244.2.235:8080
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: NodePort
[root@master ~]#
[root@master ~]# kubectl get svc java-demo2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
java-demo2 NodePort 10.104.171.129 <none> 80:30997/TCP 34s
[root@master ~]#
[root@master ~]# #查看java-demo2这个service关联的后端应用,后面的地址分别为
[root@master ~]# #10.244.1.156:8080,10.244.2.234:8080,10.244.2.235:8080
[root@master ~]# #service与endpoints是一一对应的,service创建时endpoints会自动生成
[root@master ~]# kubectl get endpoints java-demo2
NAME ENDPOINTS AGE
java-demo2 10.244.1.156:8080,10.244.2.234:8080,10.244.2.235:8080 3m7s
[root@master ~]#


手工手成一个service文件
#生成service之前需要有一个deploy的资源
#为名为java-demo2的deploy暴露服务 --port=80 cluserIP的端口为80
# --target-port=80 Pod内的端口为80,在为deploy暴露服务的同时导出yaml文件
[root@master ~]# kubectl apply -f java-demo2.yaml
deployment.apps/java-demo2 created
[root@master ~]# kubectl expose deploy java-demo2 --port=80 --target-port=80 --dry-run=client -o yaml > service5.yaml
[root@master ~]# vim service5.yaml #编辑yaml文件,删除系统的状态信息
apiVersion: v1
kind: Service
metadata:
name: java-demo2
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: java-demo
project: blog
[root@master ~]#
清空pod为后续实验提供简洁的环境
[root@master ~]# kubectl delete deploy java-demo2
deployment.apps "java-demo2" deleted #生成一个deploy文件,并使用deployment部署pod
[root@master ~]# kubectl create deployment web --image=nginx --dry-run=client -o yaml > web5.yaml
[root@master ~]# vim web5.yaml #编辑yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: web
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
[root@master ~]#
[root@master ~]# kubectl apply -f web5.yaml
deployment.apps/web created
[root@master ~]# kubectl get pods #确认pod的副本为2
NAME READY STATUS RESTARTS AGE
web-5dcb957ccc-6pjvf 1/1 Running 0 70s
web-5dcb957ccc-hwcvt 1/1 Running 0 70s
[root@master ~]# #为web5.yaml中的pod创建service,同时再次编辑service5.yaml文件
[root@master ~]# vim service5.yaml
apiVersion: v1
kind: Service
metadata:
name: web #service的名称通常与deploy名字一致,方便识别
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web #这里标签匹配的是web,与web5.yaml中pod的标签一致,所以写这个server之前
#要确认deploy中pod的标签是什么,查看方法下面有介绍
[root@master ~]#
#可以查看deployment的web5.yaml文件中的15行,即deply的标签
#也可以用指令查看pod的标签
[root@master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
web-5dcb957ccc-6pjvf 1/1 Running 0 14m app=web,pod-template-hash=5dcb957ccc
web-5dcb957ccc-hwcvt 1/1 Running 0 14m app=web,pod-template-hash=5dcb957ccc
[root@master ~]#
[root@master ~]# kubectl apply -f service5.yaml
service/web created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-5dcb957ccc-6pjvf 1/1 Running 0 18m
web-5dcb957ccc-hwcvt 1/1 Running 0 18m
[root@master ~]# #查看server的clusterIP
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web ClusterIP 10.110.196.161 <none> 80/TCP 40s
[root@master ~]#
#查看web的后端IP地址,即web服务器集群的真实IP地址:
#10.244.2.238:80,10.244.2.239:80,这两个地址也正是
#VIP 10.110.196.161的后端IP地址
[root@master ~]# kubectl get endpoints web
NAME ENDPOINTS AGE
web 10.244.2.238:80,10.244.2.239:80 12m
[root@master ~]#
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
web-5dcb957ccc-6pjvf 1/1 Running 0 31m 10.244.2.239 node2
web-5dcb957ccc-hwcvt 1/1 Running 0 31m 10.244.2.238 node2
[root@master ~]#
#注意:这里的CLUSTER-IP 10.110.196.161是供集群内部使用的一个VIP,这个
#地址没有绑定在具体的设备上,所以是ping不通的。但在集群内部可以通过
# http://10.110.196.161来访问web
[root@node1 ~]# curl 10.110.196.161
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
#在master节点访问会很慢,是kubeadmi集群自身的原因
[root@master ~]# curl 10.110.196.161
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>



#把service的类型修改为NodePort
[root@master ~]# vim service5.yaml
apiVersion: v1
kind: Service
metadata:
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort #如果没有这一行默认是Cluster-IP
[root@master ~]# kubectl apply -f service5.yaml
service/web configured
[root@master ~]# #service的类型已修改为了NodePort,但是Cluster-IP仍会被创建
#PORT(S)中多了一个30470这个端口是Node的端口,并且每个Node上都会被开启
[root@master ~]# kubectl get svc web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.110.196.161 <none> 80:30470/TCP 26h
[root@master ~]#
在Node上查看端口
[root@master ~]# netstat -natlp | grep 30470
tcp 0 0 0.0.0.0:30470 0.0.0.0:* LISTEN 1606/kube-proxy
[root@master ~]#
[root@node1 ~]# netstat -natlp | grep 30470
tcp 0 0 0.0.0.0:30470 0.0.0.0:* LISTEN 1293/kube-proxy
[root@node1 ~]#
[root@master ~]# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready master 246d v1.18.0 192.168.1.61 <none> CentOS Linux 7 (Core) 3.10.0-862.el7.x86_64 docker://18.6.1
node1 Ready <none> 246d v1.18.0 192.168.1.62 <none> CentOS Linux 7 (Core) 3.10.0-862.el7.x86_64 docker://18.6.1
node2 Ready <none> 246d v1.18.0 192.168.1.63 <none> CentOS Linux 7 (Core) 3.10.0-862.el7.x86_64 docker://18.6.1
[root@master ~]#


指定NodePort的端口,添加第10行
1 apiVersion: v1
2 kind: Service
3 metadata:
4 name: web
5 spec:
6 ports:
7 - port: 80
8 protocol: TCP
9 targetPort: 80
10 nodePort: 30008
11 selector:
12 app: web
13 type: NodePort
[root@master ~]#
[root@master ~]# kubectl apply -f service5.yaml
service/web configured
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web NodePort 10.110.196.161 <none> 80:30008/TCP 4d2h
[root@master ~]#



原文:https://www.cnblogs.com/sven-pro/p/15046975.html