k8s基础概念之二 service
什么是service:
service可以理解为逻辑上的一组Pod(一个应用),一组可以访问pod的策略,而且其他pod可以通过这个service访问到这个service代理的Pod。相对于pod而言,他会有一个固定的名称,一旦创建就固定不变
定义一个service
apiVersion: v1 kind: Service metadata: labels: app: nginx01 name: test spec: ports: - name: dns #service端口的名称 port: 80 #service 自己的端口 protocol: TCP #协议 targetPort: 80 #后端应用端口 - name: https port: 443 protocol: TCP targetPort: 443 selector: #过滤标签,Labels,如果写多个,则多个标签都要匹配 app: nginx01 sessionAffinity: None type: NodePort
因为ip是随时会变的,所以建议使用名字来访问
注:
如果在同一个namespace下访问直接http://servicename即可,如果不在同一个命名空间则需要加上命名空间,例如:curl http://nginx-svc.default ,尽量少用,
使用k8s代理外部服务
# 手动定义一个service apiVersion: v1 kind: Service metadata: labels: app: nginx-svc-ex name: nginx-svc-ex spec: ports: - name: http #service端口的名称 port: 80 #service 自己的端口 protocol: TCP #协议 targetPort: 80 #后端应用端口 sessionAffinity: None type: ClusterIP #和其他service不同的是,这个不需要标签过滤
#在yaml中 --- 为两个文件的分隔符 --- #这个不会自动生成endpoint,需要我们手动生成 apiVersion: v1 kind: Endpoints metadata: labels: app: nginx-svc-ex #和service定义时候的名称要一致 name: nginx-svc-ex subsets: - addresses: - ip: 220.181.38.251 #需要代理的外部ip ports: - name: http #这个名称和service定义协议端口的名称也要一致 port: 80 protocol: TCP #endpoint和service的名称协议全部要一致,要不然他会没办法建立链接
测试:
[root@master01 yaml]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d12h nginx-svc-ex ClusterIP 10.96.78.49 <none> 80/TCP 8s [root@master01 yaml]# kubectl get ep NAME ENDPOINTS AGE kubernetes 172.16.1.11:6443,172.16.1.12:6443 5d12h nginx-svc-ex 220.181.38.251:80 6s [root@master01 yaml]# curl 220.181.38.251:80 #测试外部链接 <html> <meta http-equiv="refresh" content="0;url=http://www.baidu.com/"> </html> [root@master01 yaml]# curl 10.96.78.49 #测试我们所代理的链接,发现返回都是一样的 <html> <meta http-equiv="refresh" content="0;url=http://www.baidu.com/"> </html>
apiVersion: v1 kind: Service metadata: labels: app: svc-ex-s name: svc-ex-s spec: type: ExternalName externalName: www.baidu.com 测试: [root@master01 yaml]# kubectl run busybox --rm=true --image=busybox --restart=Never -it / # wget svc-ex-s Connecting to svc-ex-s (112.80.248.75:80) wget: server returned error: HTTP/1.1 403 Forbidden #因为存在跨域问题,所以
service类型
ClusterIP:只是在集群内部使用 ,默认值
NodePort:在所有安装了kube-proxy的节点上打开了一个端口,外部端口映射到集群内,可以对外提供服务(端口默认30000-32767)
ExternalName:通过返回自定义的CNAME别名
自定义service端口范围
NodePort默认的端口是可以改的: 二进制: [root@master01 yaml]# cat /usr/lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes After=network.target [Service] EnvironmentFile=/etc/kubernetes/cfg/kube-apiserver.conf ExecStart=/usr/local/bin/kube-apiserver $KUBE_APISERVER_OPTS Restart=on-failure RestartSec=10 Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target [root@master01 yaml]# cat /etc/kubernetes/cfg/kube-apiserver.conf KUBE_APISERVER_OPTS="--logtostderr=false \ --v=2 \ --log-dir=/var/log/kubernetes \ --advertise-address=172.16.1.11 \ --default-not-ready-toleration-seconds=360 \ --default-unreachable-toleration-seconds=360 \ --max-mutating-requests-inflight=2000 \ --max-requests-inflight=4000 \ --default-watch-cache-size=200 \ --delete-collection-workers=2 \ --bind-address=0.0.0.0 \ --secure-port=6443 \ --allow-privileged=true \ --service-cluster-ip-range=10.96.0.0/16 \ --service-node-port-range=10000-52767 \ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \ --authorization-mode=RBAC,Node \ --enable-bootstrap-token-auth=true \ --token-auth-file=/etc/kubernetes/cfg/token.csv \ --kubelet-client-certificate=/etc/kubernetes/ssl/server.pem \ --kubelet-client-key=/etc/kubernetes/ssl/server-key.pem \ --tls-cert-file=/etc/kubernetes/ssl/server.pem \ --tls-private-key-file=/etc/kubernetes/ssl/server-key.pem \ --client-ca-file=/etc/kubernetes/ssl/ca.pem \ --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --audit-log-path=/var/log/kubernetes/k8s-audit.log \ --etcd-servers=https://172.16.1.11:2379,https://172.16.1.12:2379,https://172.16.1.13:2379 \ --etcd-cafile=/etc/etcd/ssl/ca.pem \ --etcd-certfile=/etc/etcd/ssl/etcd.pem \ --etcd-keyfile=/etc/etcd/ssl/etcd-key.pem" #--service-node-port-range就是自定义service端口的字段