1. kubernetes架构
1.1 kubernetes产品介绍
(1) Kubernetes是Google在2014年开源的一个容器集群管理系统(也称为编排工具),Kubernetes简称"K8S"。Kubernetes用于容器化应用程序的部署,扩展和管理,模板是让部署容器化应用简单高效。详细功能看官网介绍
(2) 官方文档和代码地址
https://kubernetes.io/docs/home/
https://kubernetes.io/docs/concepts/
https://kubernetes.io/docs/tasks/
https://github.com/kubernetes/kubernetes
1.2 kubernetes发展历史
2014年 docker容器编排工具,立项
2015年7月 发布kubernetes 1.0, 加入cncf基金会 孵化
2016年 kubernetes干掉两个对手,docker swarm,mesos marathon 1.2版
2017年 1.5-1.9
2018年 k8s从cncf基金会毕业项目 1.10 1.11 1.12,1.13
2019年 1.14,1.15,1.16,1.17
2020年 1.18, 1.19,1.20,1.21
2021年: 1.22
cncf: cloud native compute foundation 孵化器
kubernetes(k8s): 希腊语 舵手,领航者 容器编排领域,谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes
https://kubernetes.io/releases/patch-releases/#1-22
https://github.com/kubernetes/kubernetes
1.3 kubernetes架构图
架构详解:
(1) k8s是用来管理docker集群
(2) master节点不起容器,起容器的是node节点
(3) API Server是K8S最重要的服务了,直接控制kubelet,kubelet会直接控制docker,最终来启动容器
(4) kube-proxy 作用是给pod节点负载均衡,
(5) 新版的kubelet已经把cadvisor集成了,不用单独起cadvisor了
(6) Flannel网络类似于overlay,会把信息存在数据库中(etcd),每个pod中分配的ip地址都是唯一的
1.4 kubernetes附加组件
除了架构图上的的核心组件外,还有一些推荐的附加组件(Add-ons)
附加组件(Add-ons)基本上都是以容器的形式运行在集群中
kube-dns # 负责为整个集群提供DNS服务。
Ingress Controller # 为服务提供外网入口。
Heapster # 提供资源监控。
Dashboard # 提供GUI
Federation # 提供跨可用区的集群。
Fluentd-elasticsearch # 提供集群日志采集、存储与查询。
2. kubernetes集群搭建
2.1 kubernetes的安装方式
(1) yum安装 # 很适合新手安装,学习安装即可。
(2) kubeadm安装 # 可以使用kubeadm工具来创建和管理Kubernetes集群。 该工具能够执行必要的动作并用一种用户友好的方式启动一个可用的、安全的集群。推荐阅读:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/, https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/,https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
(3) 二进制安装 # 安装步骤比较繁琐,但可以更加了解细节。适合运维人员生产环境中使用。
(4) 源码编译安装 # 难度最大
(5) kind安装 # kind让你能够在本地计算机上运行Kubernetes。 kind要求你安装并配置好Docker。推荐阅读:https://kind.sigs.k8s.io/docs/user/quick-start/
(6) minikube安装 # minikube 是一个工具, 能让你在本地运行 Kubernetes。 minikube 在你本地的个人计算机(包括 Windows、macOS 和 Linux PC)运行一个单节点的 Kubernetes 集群,以便你来尝试 Kubernetes 或者开展每天的开发工作。因此很适合开发人员体验K8S。推荐阅读:https://minikube.sigs.k8s.io/docs/start/
小提示:
(1) 二进制安装和kubeadm安装适合企业使用
(2) k8s中文社区: https://www.kubernetes.org.cn/,有很多新版本K8S搭建的文章
(3) kubectl是Kubernetes命令行工具,kubectl使得你可以对Kubernetes集群运行命令。 可以使用kubectl来部署应用、监测和管理集群资源以及查看日志。推荐阅读:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
2.2 yum安装kubernetes集群环境
# k8s集群环境安排
10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2
# 将三个节点的hosts配置上,防火墙firewalld关闭 selinux关闭
[root@k8s-master ~]# cat /etc/hosts
10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2
2.2.1 master节点安装etcd
[root@k8s-master ~]# yum install etcd -y
[root@k8s-master ~]# vim /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"
[root@k8s-master ~]# systemctl start etcd
[root@k8s-master ~]# systemctl enable etcd
[root@k8s-master ~]# etcdctl set name dk
[root@k8s-master ~]# etcdctl get name
# 查看etcd的健康状态
[root@k8s-master ~]# etcdctl -C http://10.0.0.11:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.0.0.11:2379
cluster is healthy
2.2.2 master节点安装kebernetes
10.0.0.11 k8s-master 在这个节点上面操作
# (1) 开始安装kubernetes-master服务
[root@k8s-master ~]# yum install kubernetes-master -y
# (2) 对apiserver组件进行配置
[root@k8s-master ~]# vim /etc/kubernetes/apiserver
# The address on the local server to listen to.
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"
# Port minions listen onKUBELET_PORT="--kubelet-port=10250"
KUBELET_PORT="--kubelet-port=10250"
# Comma separated list of nodes in the etcd cluster,KUBE_SERVICE_ADDRESSES是负载均衡的vip地址
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"
# default admission control policies,暂时先把ServiceAccount给关掉,深入了解之后再深入,这里我没有关
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
# (3) 对Controller Manager和Scheduler组件进行配置
[root@k8s-master ~]# vim /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://10.0.0.11:8080"
# (4) 重启kube-apiserver、kube-controller-manager、 kube-scheduler
[root@k8s-master ~]# systemctl enable kube-apiserver.service
[root@k8s-master ~]# systemctl restart kube-apiserver.service
[root@k8s-master ~]# systemctl enable kube-controller-manager.service
[root@k8s-master ~]# systemctl restart kube-controller-manager.service
[root@k8s-master ~]# systemctl enable kube-scheduler.service
[root@k8s-master ~]# systemctl restart kube-scheduler.service
# (4) 查询组件的健康状态,这里面没有apiserver的原因是,是通过apiserver发起请求的,只要命令有结果,那么apiserver就是健康的
[root@k8s-master ~]# kubectl get componentstatus (kubectl get cs)
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
2.2.3 node节点安装kebernetes
10.0.0.12 k8s-node-1 在这个节点上操作
10.0.0.13 k8s-node-2 在这个节点上操作
# NODE节点就KUBELET_HOSTNAME这个是唯一的,其他都是相同操作
[root@k8s-node-1 ~]# vim /etc/kubernetes/config
KUBELET_HOSTNAME="--hostname-override=10.0.0.12"
[root@k8s-node-2 ~]# vim /etc/kubernetes/config
KUBELET_HOSTNAME="--hostname-override=10.0.0.13"
# (1) 安装kubernetes-node同时也把docker服务也安装上了,启动kubelet的时候,docker服务也起来了
[root@k8s-node-1 ~]# yum install kubernetes-node.x86_64 -y
# (2) 修改配置,node节点就KUBELET_HOSTNAME这个是唯一的,其他都是相同操作
## KUBELET_HOSTNAME="--hostname-override=10.0.0.12"
## KUBELET_HOSTNAME="--hostname-override=10.0.0.13"
[root@k8s-node-1 ~]# vim /etc/kubernetes/config
KUBE_MASTER="--master=http://10.0.0.11:8080"
[root@k8s-node-1 ~]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=10.0.0.12"
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
# (3) 启动kubelet、kube-proxy组件服务
[root@k8s-node-1 ~]# systemctl enable kubelet.service
[root@k8s-node-1 ~]# systemctl enable kube-proxy.service
[root@k8s-node-1 ~]# systemctl restart kubelet.service
[root@k8s-node-1 ~]# systemctl restart kube-proxy.service
# (4) 在10.0.0.11 k8s-master节点上进行查看,已经成功获取两个节点
[root@k8s-master ~]# kubectl get node
NAME STATUS AGE
10.0.0.12 Ready 36s
10.0.0.13 Ready 40s
2.2.4 k8s集群配置flannel网络
# (1) master、node-1、node-2都安装flannel,并且进行配置
[root@k8s-master ~]# yum install flannel -y
[root@k8s-master ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"
[root@k8s-node-1 ~]# yum install flannel -y
[root@k8s-node-1 ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"
[root@k8s-node-2 ~]# yum install flannel -y
[root@k8s-node-2 ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"
# (2) master节点进行操作
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "172.18.0.0/16" }'
[root@k8s-master ~]# yum install docker -y
[root@k8s-master ~]# systemctl enable flanneld
[root@k8s-master ~]# systemctl restart flanneld
[root@k8s-master ~]# systemctl enable docker
[root@k8s-master ~]# systemctl restart docker
[root@k8s-master ~]# systemctl restart kube-apiserver
[root@k8s-master ~]# systemctl restart kube-controller-manager
[root@k8s-master ~]# systemctl restart kube-scheduler
# (3) node节点就行操作
## node1操作
[root@k8s-node-1 ~]# systemctl enable flanneld
[root@k8s-node-1 ~]# systemctl restart flanneld
[root@k8s-node-1 ~]# systemctl restart docker
[root@k8s-node-1 ~]# systemctl restart kubelet
[root@k8s-node-1 ~]# systemctl restart kube-proxy
## 开通防火墙
[root@k8s-node-1 ~]# vim /usr/lib/systemd/system/docker.service
## 在[Service]区域下ExecStart上面增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
ExecStart=/usr/bin/dockerd-current \
[root@k8s-node-1 ~]# systemctl daemon-reload
[root@k8s-node-1 ~]# systemctl restart docker
## node2操作
[root@k8s-node-2 ~]# systemctl enable flanneld
[root@k8s-node-2 ~]# systemctl restart flanneld
[root@k8s-node-2 ~]# systemctl restart docker
[root@k8s-node-2 ~]# systemctl restart kubelet
[root@k8s-node-2 ~]# systemctl restart kube-proxy
## 开通防火墙
[root@k8s-node-1 ~]# vim /usr/lib/systemd/system/docker.service
## 在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
[root@k8s-node-2 ~]# systemctl daemon-reload
[root@k8s-node-2 ~]# systemctl restart docker
# (4) 测试容器的网络连通性(三个节点的容器进行ping测试,已测试网络互通)
[root@k8s-master ~]# docker load -i docker_alpine3.9.tar.gz
[root@k8s-master ~]# docker run -it alpine:3.9
小提示:
在mstar上安装flannel的原因是方便测试
在mstar上安装docker的原因是当作私有仓库
docker的网段会变跟flannel一样,因为安装好flannel之后,
会生成一个配置文件/usr/lib/systemd/system/docker.service.d/flannel.conf
flannel默认成为docker的默认网络,起容器的时候不需要指定--network
iptables -L -n 因为有k8s在,Chain FORWARD默认没有ip转发容器
临时打开: [root@k8s-node-1 ~]# iptables -P FORWARD ACCEPT # 重启docker k8s会失效
永久打开:
[root@k8s-node-1 ~]# vim /usr/lib/systemd/system/docker.service
## 在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
# 查看nginx的systemd的配置
systemctl cat nginx
2.2.5 k8s集群配置私有仓库
master节点充当私有仓库
# (1) 所有节点做相同的操作,node1,node2也是一样的
[root@k8s-master ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
[root@k8s-master ~]# systemctl restart docker
[root@k8s-node-1 ~]# cat /etc/docker/daemon.json
[root@k8s-node-2 ~]# cat /etc/docker/daemon.json
# (2) mastar节点安装私有仓库
[root@k8s-master ~]# docker load -i registry.tar.gz
[root@k8s-master ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry
# (3) 进行测试,node1节点上传镜像到私有仓库
[root@k8s-node-1 ~]# docker tag alpine:3.9 10.0.0.11:5000/alpine:3.9
[root@k8s-node-1 ~]# docker push 10.0.0.11:5000/alpine:3.9
3. kubernetes常用资源
3.1 kubernetes的pod资源
Pod是Kubernetes集群中最小部署单元,一个Pod由一个容器或多个容器组成,这些容器可以共享存储,网络等资源等。
Pod是最小的资源单位,任何的一个k8s资源都可以由yml清单文件来定义
K8S yaml的主要组成
apiVersion: v1 # api版本
kind: pod # 资源类型
metadata: #属性
spec: # 详细,资源的具体详情
# (1) 在master节点进行操作
[root@k8s-master ~]# mkdir -p k8s_yaml/pod
[root@k8s-master ~]# cd k8s_yaml/pod
[root@k8s-master pod]# vim k8s_pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
## 会出现报错,查看具体报错原因
[root@k8s-master pod]# kubectl create -f k8s_pod.yaml
## pod 资源类型、nginx 资源名字
[root@k8s-master pod]# kubectl describe pod nginx
# (2) 解决报错: 暂时去掉apiserver配置的ServiceAccount、私有仓库缺少nginx镜像、基础设施pod-infrastructure镜像
## 暂时去掉apiserver配置的ServiceAccount
[root@k8s-master pod]# vim /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
## 导入nginx镜像,上传私有仓库
[root@k8s-node-2 ~]# docker load -i docker_nginx1.13.tar.gz
[root@k8s-node-2 ~]# docker tag docker.io/nginx:1.13 10.0.0.11:5000/nginx:1.13
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/nginx:1.13
## 修改kubelet配置,导入pod-infrastructure镜像上传私有仓库
[root@k8s-node-2 ~]# cat /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/pod-infrastructure:latest"
[root@k8s-node-2 ~]# docker load -i pod-infrastructure-latest.tar.gz
[root@k8s-node-2 ~]# docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/pod-infrastructure:latest
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/pod-infrastructure:latest
[root@k8s-node-1 ~]# cat /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/pod-infrastructure:latest"
# (3) 开始测试访问
## 解决报错后,再次查看,发现pod已经起来
[root@k8s-master pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 44m
[root@k8s-master pod]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 21m 172.18.100.2 10.0.0.13
[root@k8s-master pod]# curl -I 172.18.100.2
HTTP/1.1 200 OK
Server: nginx/1.13.12
3.2 kubernetes多容器pod
在上面的单容器的pod中,创建一个pod资源,启动了两个容器,一个nginx,一个pod-infrastructure,nginx是应用容器,pod-infrastructure是定制版的pod容器来实现K8S的高级功能,应用容器和pod-infrastructure共用一个ip
pod资源:至少由两个容器组成,pod基础容器和业务容器组成(1+4)
args 相当于dockerfile CMD
command 相当于dockerfile ENTRYPOINT
多容器pod:
[root@k8s-master pod]# vim k8s_pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
- name: alpine
image: 10.0.0.11:5000/alpine:3.9
command: ["sleep","1000"]
[root@k8s-master pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 1h
test 2/2 Running 0 57s
[root@k8s-master pod]# kubectl get pods -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE LABELS
nginx 1/1 Running 0 1h 172.18.100.2 10.0.0.13 app=web
test 2/2 Running 0 1m 172.18.38.2 10.0.0.12 app=web
3.3 kubernetes的rc资源
Replicationcontroller(简称rc)保证指定数量的pod始终存活,rc通过标签选择器来关联pod,rc实现了pod的高可用
k8s资源的常见操作:
kubectl create -f xxx.yaml # 创建一个pod资源
kubectl get pod | rc # 查看pod或者rc资源
kubectl get pod | rc -o wide --show-labels # 查看详细信息
kubectl describe pod nginx # 查看nginx pod的生成过程
kubectl delete pod nginx # 删除pod
kubectl delete rc dk-nginx # 删除rc后,rc起的pod也会全部删除
kubectl delete -f xxx.yaml # 删除xxx.yaml相关的pod或者rc
kubectl edit pod nginx # 在线编辑pod资源名称为nginx的yaml配置
kubectl edit rc dk-nginx # 在线编辑rc资源名称为nginx的yaml配置
创建一个rc资源:
同一类型的资源,name不能相同,rc资源的标签选择器也不能相同
不类型的资源,labels不能相同,如果相同的话,pod会增加或减少
# (1) 创建rc资源的yaml
[root@k8s-master ~]# mkdir -p /root/k8s_yaml/rc
[root@k8s-master ~]# cd /root/k8s_yaml/rc
[root@k8s-master ~]# cat k8s_rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: dk-nginx
spec:
replicas: 5
selector:
app: ycy-web
template:
metadata:
labels:
app: ycy-web
spec:
containers:
- name: ycy-web
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
# (2) 启动rc资源
[root@k8s-master rc]# kubectl create -f k8s_rc.yml
# (3) 查看rc资源和rc生产的pod
[root@k8s-master rc]# kubectl get rc -o wide --show-labels
NAME DESIRED CURRENT READY AGE CONTAINER(S) IMAGE(S) SELECTOR LABELS
dk-nginx 5 5 5 5s linux-web 10.0.0.11:5000/nginx:1.13 app=ycy-web app=ycy-web
[root@k8s-master rc]# kubectl get pod -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE LABELS
dk-nginx-1v6jv 1/1 Running 0 14s 172.18.100.4 10.0.0.13 app=ycy-web
dk-nginx-4zzqx 1/1 Running 0 14s 172.18.100.3 10.0.0.13 app=ycy-web
dk-nginx-dkl8s 1/1 Running 0 14s 172.18.38.3 10.0.0.12 app=ycy-web
dk-nginx-k48b9 1/1 Running 0 14s 172.18.38.4 10.0.0.12 app=ycy-web
dk-nginx-ntqzs 1/1 Running 0 14s 172.18.100.5 10.0.0.13 app=ycy-web
nginx 1/1 Running 0 3h 172.18.100.2 10.0.0.13 app=web
test 2/2 Running 7 2h 172.18.38.2 10.0.0.12 app=web
3.4 kubernetes的rc升级和回滚
在k8s_rc.yml基础上创建k8s_rc2.yml
[root@k8s-master rc]# cat k8s_rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: dk-nginx
spec:
replicas: 5
selector:
app: ycy-web
template:
metadata:
labels:
app: ycy-web
spec:
containers:
- name: ycy-web
image: 10.0.0.11:5000/nginx:1.13
ports:
- containerPort: 80
[root@k8s-master rc]# cat k8s_rc2.yml
apiVersion: v1
kind: ReplicationController
metadata:
name: dk-nginx2
spec:
replicas: 5
selector:
app: ycy-web2
template:
metadata:
labels:
app: ycy-web2
spec:
containers:
- name: ycy-web2
image: 10.0.0.11:5000/nginx:1.15
ports:
- containerPort: 80
开始升级和回滚:
# (1) 上传nginx 1.15镜像到私有仓库
[root@k8s-node-2 ~]# docker load -i docker_nginx1.15.tar.gz
[root@k8s-node-2 ~]# docker tag docker.io/nginx:latest 10.0.0.11:5000/nginx:1.15
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/nginx:1.15
# (2) 开始升级和回滚
## 开始升级,--update-period=10s 指定更新的间隔,默认为1min
[root@k8s-master rc]# kubectl rolling-update dk-nginx -f k8s_rc2.yml --update-period=10s
[root@k8s-master rc]# curl -I 172.18.38.5
HTTP/1.1 200 OK
Server: nginx/1.15.5
## 开始回滚
[root@k8s-master rc]# kubectl rolling-update dk-nginx2 -f k8s_rc.yml --update-period=1s
[root@k8s-master rc]# curl -I 172.18.100.5
HTTP/1.1 200 OK
Server: nginx/1.13.12
3.5 kubernetes的service资源
service帮助pod暴露端口,简称svc
我们发现上面创建的nginx只能在宿主机访问,不能再浏览器访问,生成的五个pod都有各自的ip
访问宿主机(10.0.0.12:3000) --> 访问负载均衡kube-proxy(cluster-VIP) --> pod
访问负载均衡kube-proxy通过选择器lables来均衡分发请求给pod
k8s新命令
# 查看svc资源信息
[root@k8s-master svc]# kubectl describe svc myweb
# 进入pod容器内,跟docker exec一样的效果
[root@k8s-master svc]# kubectl exec -it dk-nginx-7r5fl /bin/bash
# 命令行直接修改rc资源的replicas副本数
[root@k8s-master svc]# kubectl scale rc dk-nginx --replicas=2
开始创建svc资源
# (1) 创建service资源
[root@k8s-master ~]# mkdir -p /root/k8s_yaml/svc
[root@k8s-master ~]# cd /root/k8s_yaml/svc
[root@k8s-master svc]# vim k8s_svc.yaml
apiVersion: v1
kind: Service # 简称svc
metadata:
name: myweb
spec:
type: NodePort # 默认类型为ClusterIP
ports:
- port: 80 # clusterVIP端口
nodePort: 30000 # 指定基于NodePort类型对外暴露的端口,若不指定,则会在"30000-32767"端口访问内随机挑选一个未监听的端口暴露
targetPort: 80 # 指定后端Pod服务监听的端口
selector:
app: ycy-web # 指定匹配的Pod对应的标签
[root@k8s-master svc]# kubectl create -f k8s_svc.yaml
# (2) 进行查看svc资源
## kubernetes是k8s自带的
[root@k8s-master svc]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 5d
myweb 10.254.111.184 <nodes> 80:30000/TCP 11s
[root@k8s-master svc]# kubectl describe svc myweb
## 手动修改rc资源的replicas副本数
[root@k8s-master svc]# kubectl edit svc myweb
## 命令行直接修改rc资源的replicas副本数
[root@k8s-master svc]# kubectl scale rc dk-nginx --replicas=2
[root@k8s-master svc]# kubectl get pod
NAME READY STATUS RESTARTS AGE
dk-nginx-7r5fl 1/1 Running 0 7m
dk-nginx-spr1l 1/1 Running 0 7m
# (3) 进入dk-nginx-7r5fl、dk-nginx-spr1l容器修改nginx配置均衡,进行验证
[root@k8s-master svc]# kubectl exec -it dk-nginx-7r5fl /bin/bash
root@dk-nginx-7r5fl:/# echo "web01" > /usr/share/nginx/html/index.html
[root@k8s-master svc]# kubectl exec -it dk-nginx-spr1l /bin/bash
root@dk-nginx-spr1l:/# echo "web02" > /usr/share/nginx/html/index.html
## 进行验证是否起到了负载
[root@k8s-master svc]# curl http://10.0.0.12:30000
web01
[root@k8s-master svc]# curl http://10.0.0.12:30000
web02
小提示
# (1) 修改nodePort范围,重启apiservice服务
[root@k8s-master svc]# vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-60000"
[root@k8s-master svc]# [root@k8s-master svc]# systemctl restart kube-apiserver.service
# (2) 命令行创建service资源,rc的名称会与svc的名字一样,nodePort这个端口没有指定那就随机生成
[root@k8s-master svc]# kubectl expose rc dk-nginx --port=80 --target-port=80 --type=NodePort
# (3) service默认使用iptables来实现负载均衡,k8s 1.8版本中推荐使用lvs,或者两者都会用到
## 查看iptables
[root@k8s-node-2 ~]# iptables -t nat -L -n
KUBE-SVC-NPX46M4PTMTKRN6Y tcp -- 0.0.0.0/0 10.254.0.1 /* default/kubernetes:https cluster IP */ tcp dpt:443
KUBE-SVC-YG65S75AKNCDZRSF tcp -- 0.0.0.0/0 10.254.111.184 /* default/myweb: cluster IP */ tcp dpt:80
## 查看lvs
[root@k8s-node-2 ~]# ipvsadm -L -n