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>

 

service反代外部域名

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端口的字段

 

posted @ 2021-12-16 16:37  念长卿  阅读(323)  评论(0)    收藏  举报