运维相关DevOpsKubernetes

搭建kubernetes集群及kubernetes集群的应用

2019-02-21  本文已影响1人  任总

一、容器编排软件

1、docker编排三剑客:联合使用

docker-machine 管理主机容器
docker-swarm 跨主机,监控容器
docker-compose 编排主机容器

2、ASF旗下的mesos资源调度框架,依赖于marathon编排容器

3、 Google旗下的kubernetes,核心思想是一切皆容器,容器调度框架是Borg

Kubernetes 特点

二、Kubernetes组件

物理组件master和node
物理组件

1、Master 组件

ETCD
kube-controller-manager
cloud-controller-manager
kube-scheduler
插件 addons
DNS
用户界面
容器资源监测
Cluster-level Logging

(1)、kube-apiserver

(2)、 ETCD

(3)、kube-controller-manager

这些控制器包括:

(4)、cloud-controller-manager

cloud-controller-manager 具体功能:

(5)、kube-scheduler

(6)插件 addons

(7)DNS

(8)用户界面

(9)Cluster-level Logging

2、节点(Node)组件

kubelet
kube-proxy
docker
RKT
supervisord
fluentd

(1)、kubelet

kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:

(2)、kube-proxy

(3)、docker

(4)、RKT

(5)、supervisord

(6)fluentd

核心组件
node节点内部组件
Pod内部的容器

3、Node节点的内部组件

4、Pod

Pod内部容器通信,存储 Pod实现
Label标签
services实现

5、Services

6、Discovering services服务发现

第一种:Environment variables环境变量
第二种:DNS

7、kubernetes的网络

三、kubernetes集群快速部署

OS:CentOS 7.3.1611, Extras仓库中;

安装配置步骤:

1、etcd,仅master节点;
2、flannel,集群的所有节点;
3、配置k8s的master:仅master节点;
kubernetes-master
启动的服务:
kube-apiserver, kube-scheduler, kube-controller-manager
4、配置k8s的各Node节点;
kubernetes-node
先设定启动docker服务;
启动的k8s的服务:
kube-proxy, kubelet

1、部署kubernetes的master节点

设置解析hosts文件
[root@node-61 ~]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.61  master.localhost.localdomain master etcd1 registry
192.168.1.62  node1.localhost.localdomain node1
192.168.1.63  node2.localhost.localdomain node2
为了方便节点间的通信,使用ssh
[root@node-61 ~]# ssh-keygen -t rsa -P ''

[root@node-61 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1

[root@node-61 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2

同步hosts文件
[root@node-61 ~]# scp /etc/hosts node1:/etc/
hosts                                                                                                 100%  321     9.8KB/s   00:00    
[root@node-61 ~]# scp /etc/hosts node2:/etc/
hosts                          
查看yum中有无extras仓库
[root@node-61 ~]# yum repolist
...........
!extras/7/x86_64 
部署etcd

etcd是开源的分布式键值存储,同时支持服务发现,支持leader选举,由go语言研发,访问接口是HTTP+JSON的API。
开发或实验环境部署etcd,单节点即可


开发或实验环境部署etcd

生产环境部署etcd,多节点集群部署,一般为奇数3、5、7、9个。


生产环境部署etcd
安装etcd
[root@node-61 ~]# yum install etcd -y

监听两个端口2379和2380

编辑etcd配置文件
[root@master ~]# vim /etc/etcd/etcd.conf
#[Member]成员配置
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"      #存储目录
ETCD_LISTEN_PEER_URLS="http://192.168.1.61:2380"      #监听集群地址端口
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.61:2379"    #监听客户端地址端口
ETCD_NAME="default"   #名称

#[Clustering]集群配置
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.61:2380"     #集群通告地址端口
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.61:2379"    #集群客户端口
ETCD_INITIAL_CLUSTER="default=http://192.168.1.61:2380"       #集群成员,如果有多个成员在http中间用,隔离,default要保持与name一致。

  • name:节点名称
  • data-dir:指定节点的数据存储目录
  • listen-peer-urls: 监听URL,用于与其他节点通讯
  • listen-client-urls :对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379 ,客户端会连接到这里和 etcd 交互
  • initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
  • initial-cluster :集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,… >。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值
  • initial-cluster-state:新建集群的时候,这个值为 new ;假如已经存在的集群,这个值为 existing
  • initial-cluster-token : 创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误
  • advertise-client-urls: 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
启动etcd
[root@master ~]# systemctl start etcd
[root@master ~]# ss -tnl
State      Recv-Q Send-Q                                                                   Local Address:Port                                                                                  Peer Address:Port              
LISTEN     0      128                                                                       192.168.1.61:2379                                                                                             *:*                  
LISTEN     0      128                                                                       192.168.1.61:2380                                                                                             *:*    
集群检查
#集群信息
[root@master ~]# etcdctl -C http://master:2379 member list
8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://192.168.1.61:2379 isLeader=true

#集群健康状态
[root@master ~]# etcdctl -C http://master:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://192.168.1.61:2379

etcd键值存储使用
#创建目录
[root@master ~]# etcdctl -C http://master:2379 mkdir test
[root@master ~]# etcdctl -C http://master:2379 mkdir ls

#查询目录
[root@master ~]# etcdctl -C http://master:2379 ls
/test
/ls

#删除空目录
[root@master ~]# etcdctl -C http://master:2379 rmdir ls
[root@master ~]# etcdctl -C http://master:2379 ls
/test

#创建键值
[root@master ~]# etcdctl -C http://master:2379 mk /test/newkey hello
hello

#获取键值
[root@master ~]# etcdctl -C http://master:2379 get  /test/newkey 
hello

#修改键值
[root@master ~]# etcdctl -C http://master:2379 set  /test/newkey hello-world
hello-world

#删除非空目录
[root@master ~]# etcdctl -C http://master:2379  rm -r /test

安装kubernetes-master
[root@master ~]# yum install kubernetes-master -y

配置
[root@master ~]# vim /etc/kubernetes/apiserver
#非安全http协议的监听地址
KUBE_API_ADDRESS="--insecure-bind-address=192.168.1.61"
#监听端口
# KUBE_API_PORT="--port=8080"
#kubelet监听端口
# KUBELET_PORT="--kubelet-port=10250"
#集群成员,中间用逗号隔开
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.1.61:2379"
#k8s内部服务的地址网段
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
#默认的控制:名称空间生命周期、名称空间存在、资源限制、安全上下文限制、资源配额
policiesKUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
#自定义选项
KUBE_API_ARGS=""
[root@master ~]# vim /etc/kubernetes/config 
#标准日志输出
KUBE_LOGTOSTDERR="--logtostderr=true"
#日志记录级别
KUBE_LOG_LEVEL="--v=0"
#是否允许某个节点运行特权容器
KUBE_ALLOW_PRIV="--allow-privileged=false"
#master地址
KUBE_MASTER="--master=http://192.168.1.61:8080"
~                                                        
启动kubernetes
#启动三个服务
[root@master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@master ~]# ss -tnl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128    192.168.1.61:2379                      *:*                  
LISTEN     0      128    192.168.1.61:2380                      *:*                  
LISTEN     0      128    192.168.1.61:8080                      *:*                  
LISTEN     0      128           *:22                        *:*                  
LISTEN     0      100    127.0.0.1:25                        *:*                  
LISTEN     0      128          :::6443                     :::*                  
LISTEN     0      128          :::10251                    :::*                  
LISTEN     0      128          :::10252                    :::*     
建立docker私有镜像仓库
[root@master ~]# yum install docker-distribution -y
[root@master ~]# systemctl start docker-distribution.service

[root@master ~]# ss -tnl

LISTEN     0      128          :::5000                     :::*  

2、node节点的安装

#安装docker
[root@node-62 ~]# yum install docker -y

#配置私有仓库
[root@node-62 ~]# vim /etc/docker/daemon.json 
{ "insecure-registries":["192.168.1.61:5000"] }

#启动docker
[root@node-62 ~]# systemctl start docker

下载镜像,并上传到私有仓库
#从公有仓储下载centos
[root@node-62 ~]# docker pull centos:latest

#修改标签
[root@node-62 ~]# docker tag docker.io/centos:latest 192.168.1.61:5000/centos:latest

#上传到私有仓库
[root@node-62 ~]# docker push 192.168.1.61:5000/centos:latest

两个节点安装kubernetes的node
[root@node-63 ~]# yum install kubernetes-node -y
配置文件
[root@node-62 ~]# vim /etc/kubernetes/kubelet 
#监听地址
KUBELET_ADDRESS="--address=0.0.0.0"

#监听端口
# KUBELET_PORT="--port=10250"

#使用的主机名称,如果引号内部为空,则使用默认系统主机名
KUBELET_HOSTNAME="--hostname-override=node1"

#指明master主机地址
KUBELET_API_SERVER="--api-servers=http://master:8080"

#基础架构容器地址
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

#自定义选项
KUBELET_ARGS=""

#全局配置文件
[root@node-62 ~]# vim /etc/kubernetes/config
........
KUBE_MASTER="--master=http://master:8080"   #指明master主机地址端口


#node1配置文件同步到node2上
[root@node-62 ~]# scp /etc/kubernetes/*  node2:/etc/kubernetes/

启动kubernetes-node
[root@node-62 ~]# systemctl start kubelet.service kube-proxy.service
[root@node-62 ~]# ss -tnl
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN     0      128    127.0.0.1:10248                     *:*                  
LISTEN     0      128    127.0.0.1:10249                     *:*                  
LISTEN     0      128           *:22                        *:*                  
LISTEN     0      100    127.0.0.1:25                        *:*                  
LISTEN     0      128          :::10250                    :::*                  
LISTEN     0      128          :::10255                    :::*                  
LISTEN     0      128          :::22                       :::*                  
LISTEN     0      100         ::1:25                       :::*                  
LISTEN     0      128          :::4194                     :::* 

3、master节点运行容器

kubernetes的状态查询
#查看api版本
[root@master ~]# kubectl -s http://master:8080 api-versions
apps/v1beta1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1beta1
autoscaling/v1
batch/v1
certificates.k8s.io/v1alpha1
extensions/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1alpha1
storage.k8s.io/v1beta1
v1

#查看集群相关

[root@master ~]# kubectl -s http://master:8080 cluster-info
Kubernetes master is running at http://master:8080

#获取详细信息
[root@master ~]# kubectl -s http://master:8080 cluster-info dump

#获取节点信息
[root@master ~]# kubectl -s http://master:8080 get no
NAME      STATUS    AGE
node1     Ready     13h
node2     Ready     13h

#查询运行pod
[root@master ~]# kubectl -s http://master:8080 get po
运行容器

格式:kubectl run NAME --image=image [--env="key=value"] [--port=port]
[--replicas=replicas] [--dry-run=bool] [--overrides=inline-json] [--command] --
[COMMAND] [args...] [options]

name:名字
image:镜像路径
--port:暴露端口
--replicas:启动几个副本
--dry-run:测试运行
--overrides:覆盖

--command:改变启动默认命令

#使用私有仓库创建pod
[root@master ~]# kubectl -s http://master:8080 run centos7base --image=192.168.1.61:5000/centos:latest --replicas=2
deployment "centos7base" created

#查询
[root@master ~]# kubectl -s http://master:8080 get deployments
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
centos7base   2         2         2            0           29s

#删除部署pod
[root@master ~]# kubectl -s http://master:8080 delete deployment centos7base
deployment "centos7base" deleted

创建pod报错

状态始终是 ContainerCreating,各个节点中也无创建容器
[root@master ~]# kubectl -s http://master:8080 get pods
NAME                    READY     STATUS              RESTARTS   AGE
bbox-3908540199-t7khd   0/1       ContainerCreating   0          4m

#查询日志

[root@master ~]# kubectl -s http://master:8080 describe pod bbox-3908540199-t7khd
.....................
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

#解决方法
原因是node节点上:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt这个目录中是一个软连接,实际上并没有这个文件。

#在两个node节点上下载
[root@node-62 ~]#  wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

#安装
[root@node-62 ~]#  rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem


4、配置flannel网络

因为flannel的网络配置要保存在etcd中,所以master和两个node节点也要按装etcd

[root@node-62 ~]# yum install etcd -y
[root@node-62 ~]# yum install flannel -y

修改配置文件
[root@master ~]# vim /etc/sysconfig/flanneld 
#etcd地址端口
FLANNEL_ETCD_ENDPOINTS="http://etcd1:2379"
#存储路径
FLANNEL_ETCD_PREFIX="/ilinux.io/network"

#给两个node节点同步配置
[root@master ~]# scp /etc/sysconfig/flanneld node2:/etc/sysconfig/

[root@master ~]# scp /etc/sysconfig/flanneld node1:/etc/sysconfig/

#创建网络
[root@master ~]# etcdctl -C http://etcd1:2379 mk /ilinux.io/network/config '{"Network":"10.7.0.0/16"}'
{"Network":"10.7.0.0/16"}

所有节点启动flanneld服务
[root@master ~]# systemctl start flanneld.service

#flannel自动创建一个隧道网桥

[root@master ~]# ifconfig

................
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1472
        inet 10.7.54.0  netmask 255.255.0.0  destination 10.7.54.0
        inet6 fe80::21d5:9d6a:a31a:d587  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 500  (U

两个node节点重新启动docker服务,使docker自动获取flannel的地址


[root@node-62 ~]# systemctl restart docker.service
[root@node-62 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.7.9.1  netmask 255.255.255.0  broadcast 0.0.0.0

两个node节点容器测试通信

#node1节点容器
#添加防火墙规则
[root@node-62 ~]# iptables -A FORWARD -s 10.7.9.0/16 -j ACCEPT

[root@node-62 ~]# docker run --name bbox1 --rm -it busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:07:09:02  
          inet addr:10.7.9.2  Bcast:0.0.0.0  Mask:255.255.255.0
/ # ping 10.7.90.2


#node2节点容器
#添加防火墙规则
[root@node-63 ~]# iptables -A FORWARD -s 10.7.90.0/16 -j ACCEPT

[root@node-63 ~]# docker run --name bbox1 --rm -it busybox:latest
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:07:5A:02  
          inet addr:10.7.90.2  Bcast:0.0.0.0  Mask:255.255.255.0
/ # ping 10.7.9.2

四、kubernetes的对象

1、运行容器遇到问题

kubernetes集群必须确保对象存在,目标状态,通过kubernetes server交互

kubernetes对象有两种状态:

2、容器编排配置文件

各种类型对象及其相关属性文档:
https://v1-9.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.9

apiversion:api版本
kind:指明当前属于哪一种部署方式
metadata:源数据配置段
name:定义deployment引用名称
spec:目标状态配置段
replicas:启动pod的数量
template:要创建的pod模板
labels:标签
app:nginx:键值对,键app、值nginx
containers:容器,列出pod中的容器,至少应该一个,且不可被更新。

kubectl create -f ./deployment-example.yaml --record

启动pod常用格式

Deployment对象格式
DaemonSet对象格式 service对象格式

ports:开放端口
slector:挑选器pod,请求发往那个pod
type :请求转发到pod类型,例如:clusterip、loadbalancer,nodeport,extername

3、示例

master节点启动服务
[root@master ~]# systemctl start etcd.service
[root@master ~]# systemctl start flanneld.service
[root@master ~]# systemctl start docker-distribution.service
[root@master ~]# systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service
[root@master ~]# ss -tnl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128    192.168.1.61:2379                      *:*                  
LISTEN      0      128    192.168.1.61:2380                      *:*                  
LISTEN      0      128    192.168.1.61:8080                      *:*                  
LISTEN      0      128           *:22                        *:*                  
LISTEN      0      100    127.0.0.1:25                        *:*                  
LISTEN      0      128          :::5000                     :::*                  
LISTEN      0      128          :::6443                     :::*                  
LISTEN      0      128          :::10251                    :::*                  
LISTEN      0      128          :::10252                    :::*                  
LISTEN      0      128          :::22                       :::*                  
LISTEN      0      100         ::1:25   
node1和node2节点启动服务
#避免docker下载https报错,添加
[root@master ~]# vim /etc/docker/daemon.json 
{ "insecure-registries":["192.168.1.61:5000"] }

#启动服务
[root@node-62 ~]# systemctl start flanneld.service docker.service kube-proxy.service  kubelet.service
[root@node-62 ~]# ss -tnl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128    127.0.0.1:10248                     *:*                  
LISTEN      0      128    127.0.0.1:10249                     *:*                  
LISTEN      0      128           *:22                        *:*                  
LISTEN      0      100    127.0.0.1:25                        *:*                  
LISTEN      0      128          :::10250                    :::*                  
LISTEN      0      128          :::10255                    :::*                  
LISTEN      0      128          :::22                       :::*                  
LISTEN      0      100         ::1:25                       :::*                  
LISTEN      0      128          :::4194                     :::*     
制作镜像
[root@node-62 ~]# mkdir bbox-httpd
[root@node-62 ~]# cd bbox-httpd/
#测试网页
[root@node-62 bbox-httpd]# vim index.html
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

#dockerfile
[root@node-62 bbox-httpd]# vim dockerfile
FROM docker.io/busybox:latest
MAINTAINER "hehe@hehe.com"
ADD index.html /appdata/html/
EXPOSE 80/tcp
CMD ["/bin/httpd","-f","-h","/appdata/html/"]

#制作镜像
[root@node-62 bbox-httpd]# docker build ./ -t 192.168.1.61:5000/bbox-httpd:v0.2


#推送到私有仓库
[root@node-62 bbox-httpd]# docker push  192.168.1.61:5000/bbox-httpd:v0.2

#节点2从私有仓库下载镜像
[root@node-63 ~]# docker pull 192.168.1.61:5000/bbox-httpd:v0.2


在master节点制作对象,严格控制缩进
[root@master ~]# vim deploy-bbox.yaml

apiVersion: extensions/v1beta1
kind: Deployment     
metadata:
  name: deploy-bbox  #名称
spec:                         #定义状态
  replicas: 2               #启动2个
  template:                 #模板
    metadata:
      labels:               #标签
        # Apply this label to pods and default
        # the Deployment label selector to this value
        app: bbox        #键值
    spec:
      containers:         #容器
      - name: bbox-httpd     #名称
        # Run this image
        image: 192.168.1.61:5000/bbox-httpd:v0.2         #使用镜像
使用对象创建服务
[root@master ~]# kubectl -s http://master:8080 create -f ./deploy-bbox.yaml
deployment "deploy-bbox" created

#检查
[root@master ~]# kubectl -s http://master:8080 get pods
NAME                           READY     STATUS    RESTARTS   AGE
deploy-bbox-2224464794-0qz7g   1/1       Running   0          2m
deploy-bbox-2224464794-prn3r   1/1       Running   0          2m


#在node节点上检查
[root@node-63 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
a62ea351f09a        registry:5000/bbox-httpd:v0.2                                "/bin/httpd -f -h ..."   27 minutes ago      Up 27 minutes                           k8s_bbox-httpd.80dbe7ba_deploy-bbox-2224464794-prn3r_default_cb54e66f-1e51-11e9-b922-000c294b0a1b_0554d71f
f182922c8df9        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           28 minutes ago      Up 27 minutes                           k8s_POD.ae8ee9ac_deploy-bbox-2224464794-prn3r_default_cb54e66f-1e51-11e9-b922-000c294b0a1b_f68413f2

#查询pod的ip地址
...............
 "IPAddress": "10.7.25.2",

#测试,并显示测试页面
[root@node-63 ~]# curl http://10.7.25.2
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

#删除服务
[root@master ~]# kubectl -s http://master:8080 delete -f ./deploy-bbox.yaml
deployment "deploy-bbox" deleted

集群内访问service
#编辑service对象
[root@master ~]# vim bbox-httpd-service.yaml
kind: Service    #定义类型为服务
apiVersion: v1
metadata:
  # Unique key of the Service instance
  name: bbox-httpd-service     #名称
spec:
  ports:
    # Accept traffic sent to port 80
    - name: http
      port: 80                    #监听端口
      targetPort: 80          #暴露端口
  selector:
    # Loadbalance traffic across Pods matching
    # this label selector
    app: bbox
  type: LoadBalancer      #访问为轮询

#创建服务
[root@master ~]# kubectl -s http://master:8080  create -f ./bbox-httpd-service.yaml 
service "bbox-httpd-service" created

#查询服务状态
[root@master ~]# kubectl -s http://master:8080  get service
NAME                 CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
bbox-httpd-service   10.254.18.11   <pending>     80:31849/TCP   14s
kubernetes           10.254.0.1     <none>        443/TCP        7d

[root@master ~]# kubectl -s http://master:8080  describe service
Name:           bbox-httpd-service
Namespace:      default
Labels:         <none>
Selector:       app=bbox
Type:           LoadBalancer
IP:         10.254.241.102
Port:           http    80/TCP
NodePort:       http    32303/TCP
Endpoints:      10.20.52.2:80,10.20.64.2:80
Session Affinity:   None
No events.


#node节点上的iptable规则
[root@node-63 ~]# iptables -t nat -vnL | grep 10.254
    0     0 KUBE-SVC-PJU34ZRWOF2LNB5M  tcp  --  *      *       0.0.0.0/0            10.254.241.102       /* default/bbox-httpd-service:http cluster IP */ tcp dpt:80
    0     0 KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  *      *       0.0.0.0/0            10.254.0.1           /* default/kubernetes:https cluster IP */ tcp dpt:443

#集群内部访问测试
[root@node-62 ~]#   curl http://10.254.241.102
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

[root@node-63 ~]#   curl http://10.254.241.102
<h1>Busybox  Test Httpd Server</h1>
<h2>k8s cluster</h2>

4、Ingress应用

因为k8s内部使用的ip,只能集群内部使用,因此集群外部无法访问内部应用或服务的ip地址,建立Ingress使service的url映射映射到master的url上,用户访问master的url即可访问内部service。

参考链接:https://cloud.tencent.com/developer/article/1156329

上一篇下一篇

猜你喜欢

热点阅读