1.k8s基本介绍及k8s集群安装部署
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
1.k8s集群基本介绍
1.什么是k8
k8s是一个docker集群的管理工具
k8s是容器的编排工具
2.k8s的核心功能
自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
私密配置文件管理. web容器里面,数据库的账户密码(测试库密码)
3.k8s的历史
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
2019年: 1.13, 1.14 ,1.15,1.16 1.17
cncf :cloud native compute foundation 孵化器
kubernetes (k8s): 希腊语 舵手,领航者 容器编排领域,
谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes
4.k8s的安装方式
yum安装 1.5 最容易安装成功,最适合学习的
源码编译安装---难度最大 可以安装最新版
二进制安装---步骤繁琐 可以安装最新版 shell,ansible,saltstack
kubeadm 安装最容易, 网络 可以安装最新版
minikube 适合开发人员体验k8s, 网络
5.k8s的应用场景
k8s最适合跑微服务项目
6.k8s集群的架构

除了核心组件,还有一些推荐的Add-ons
组件名称 | 说明 |
kube-dns | 负责为整个集群提供DNS服务 |
Ingress Controller | 为服务提供外网入口 |
Heapster | 提供资源监控 |
Dashboard | 提供GUI |
Federation | 提供跨可用区的集群 |
Fluentd-elasticsearch | 提供集群日志采集、存储与查询 |
2.k8s集群的安装
1.修改IP地址、主机名和host解析
10.0.0.11 k8s-master
10.0.0.12 k8s-node-1
10.0.0.13 k8s-node-2
所有节点需要做hosts解析
2.master节点安装etcd
[root@k8s-master ~]# yum install etcd -y
###修改配置文件
[root@k8s-master ~]# egrep "^[a-Z]" /etc/etcd/etcd.conf
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"###etcd数据目录
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"##etcd监听的地址
ETCD_NAME="default"###etcd名字
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"#etcd集群通信地址
[root@k8s-master ~]# systemctl start etcd
[root@k8s-master ~]# systemctl enable etcd
###检查etcd配置是否成功
注意8e9e05c52164694d是随机生成的memid
[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
etcd原生支持做集群
3.master节点安装kubernetes
[root@k8s-master ~]# yum install kubernetes-master.x86_64 -y
####修改配置文件
[root@k8s-master ~]# egrep "^[a-Z]" /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"#apiserver监听地址
KUBE_API_PORT="--port=8080"###apiserver监听端口
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379"#etcd服务端地址
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"#集群ip段,暂时不配置
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"##准入控制策略,为方便学习,将倒数第二个策略删除
KUBE_API_ARGS=""###自定义参数,暂时不设置
[root@k8s-master ~]# egrep "^[a-Z]" /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"#日志是否写入系统日志
KUBE_LOG_LEVEL="--v=0"#日志级别
KUBE_ALLOW_PRIV="--allow-privileged=false"#是否开启容器的特权模式
KUBE_MASTER="--master=http://10.0.0.11:8080"#k8smaster地址
##启动服务
[root@k8s-master ~]# systemctl enable kube-apiserver.service
[root@k8s-master ~]# systemctl restart kube-apiserver.service
[root@k8s-master ~]# systemctl restart kube-controller-manager.service
[root@k8s-master ~]# systemctl restart kube-scheduler.service
##检查是否安装正常
[root@k8s-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
etcd-0 Healthy {"health":"true"}
scheduler Healthy ok
controller-manager Healthy ok
###########cs=componentstatus
4.node节点安装kubernetes
[root@k8s-node01 ~]# yum install kubernetes-node.x86_64 -y
####修改配置文件
[root@k8s-node01 ~]# egrep "^[a-Z]" /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"##是否写入系统日志
KUBE_LOG_LEVEL="--v=0"##日志级别
KUBE_ALLOW_PRIV="--allow-privileged=false"##是否开启容器特权模式
KUBE_MASTER="--master=http://10.0.0.11:8080"##k8s master地址
[root@k8s-node01 ~]# egrep "^[a-Z]" /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"##监听地址
KUBELET_HOSTNAME="--hostname-override=10.0.0.12"##节点名字,不配置使用主机名作为节点名字,注意节点名字不能冲突
KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"#apiserver地址
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"##pod基础容器pull地址,暂不设置,后面会设置为私有仓库地址
KUBELET_ARGS=""##自定义参数,暂不设置
####node节点启动服务
[root@k8s-node01 ~]# systemctl enable kubelet.service
[root@k8s-node01 ~]# systemctl restart kubelet.service
[root@k8s-node01 ~]# systemctl restart kube-proxy.service
[root@k8s-node01 ~]# systemctl enable kube-proxy.service
##注意需要将docker设置为开机自启动
如果node节点安装k8s会安装自动docker,如果docker服务没起来,那么kubelet服务也无法启动,kubelet会自动拉起docker服务。具体原因为Kubelet服务启动文件有如下内容:
[root@k8s-node01 ~]# systemctl cat kubelet.service|grep -E “After|Requires”
After=docker.service##docker启动之后再启动kubelet
Requires=docker.service###需求是docker
####在master节点检查
[root@k8s-master ~]# kubectl get nodes
NAME STATUS AGE
10.0.0.12 Ready 57m
10.0.0.13 Ready 57m
3.k8s集群网络插件flannel部署
1.flannel网络的三种模式
udp模式
hostgw网络
vxlan网络
udp模式:使用设备flannel.0进行封包解包,不是内核原生支持,上下文切换较大,性能非常差
vxlan模式:使用flannel.1进行封包解包,内核原生支持,性能较强
host-gw模式:无需flannel.1这样的中间设备,直接宿主机当作子网的下一跳地址,性能最强
host-gw的性能损失大约在10%左右,而其他所有基于VXLAN“隧道”机制 的网络方案,性能损失在20%~30%左右
详细请参阅以下链接https://bbs.huaweicloud.com/blogs/126511
2.所有节点配置flannel网络
yum install flannel -y
[root@k8s-master ~]# cat /etc/sysconfig/flanneld
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379"##etcd链接地址
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"#链接etcd的前缀,设置网络地址段
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
3.配置udp模式网络
###master节点
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{"Network":"172.18.0.0/16"}'
[root@k8s-master ~]# systemctl restart flanneld.service
[root@k8s-master ~]# systemctl enable flanneld.service
###全部node节点
[root@k8s-node01 ~]# systemctl restart flanneld.service
[root@k8s-node01 ~]# systemctl enable flanneld.service
######各节点查看网卡,发现多了一个flannel0网卡,并随机分配了一个网段但是docker的网段和flannel的网段不一致
需要重启docker才会一致
[root@k8s-node02 ~]# systemctl restart docker
###两个节点启动一个容器
[root@k8s-node02 ~]# docker run -it docker.io/alpine:latest
[root@k8s-node01 ~]# docker run -it docker.io/alpine:latest
###测试两个节点容器的联通性
在node01节点的容器中ping node02节点容器的网关,发现可以ping通
/ # ping -c1 -W1 172.18.17.1
PING 172.18.17.1 (172.18.17.1): 56 data bytes
64 bytes from 172.18.17.1: seq=0 ttl=61 time=2.920 ms
--- 172.18.17.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 2.920/2.920/2.920 ms
###但是ping容器的ip地址,发现无法ping通
/ # ping -c1 -W1 172.18.17.2
PING 172.18.17.2 (172.18.17.2): 56 data bytes
--- 172.18.17.2 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
###容器ping不通需要调一下iptables防火墙的规则
[root@k8s-node01 ~]# iptables -P FORWARD ACCEPT
然后再ping以下node01的容器,发现网络已经通了
/ # ping -c1 -W1 172.18.17.2
PING 172.18.17.2 (172.18.17.2): 56 data bytes
64 bytes from 172.18.17.2: seq=0 ttl=60 time=2.199 ms
--- 172.18.17.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 2.199/2.199/2.199 ms
但是网络延迟比较高
4.配置vxlan模式网络
###所有主机先关闭flannel服务
[root@k8s-master ~]# systemctl stop flanneld
[root@k8s-node01 ~]# systemctl stop flanneld
[root@k8s-node02 ~]# systemctl stop flanneld
###删除之前etcd创建的key并重新创建
[root@k8s-master ~]# etcdctl rm /atomic.io/network/config
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{"Network":"172.18.0.0/16","Backend": {"Type": "vxlan"}}'
###各节点重新启动flannel网络和docker并启动一组容器
[root@k8s-node02 ~]# systemctl restart flanneld.service
[root@k8s-node01 ~]# systemctl restart flanneld.service
[root@k8s-master ~]# systemctl restart flanneld.service
[root@k8s-node02 ~]# docker run -it docker.io/alpine:latest
[root@k8s-node01 ~]# docker run -it docker.io/alpine:latest
####查看网卡信息我们可以看到flannel.0变成了flannel.1
###测试两个节点容器的联通性
在node01节点的容器中ping node02节点容器的网关,发现可以ping通
/ # ping -c1 -W1 172.18.17.1
PING 172.18.17.1 (172.18.17.1): 56 data bytes
64 bytes from 172.18.17.1: seq=0 ttl=61 time=2.920 ms
--- 172.18.17.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 2.920/2.920/2.920 ms
###但是ping容器的ip地址,发现无法ping通
/ # ping -c1 -W1 172.18.17.2
PING 172.18.17.2 (172.18.17.2): 56 data bytes
--- 172.18.17.2 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
###容器ping不通需要调一下iptables防火墙的规则
[root@k8s-node01 ~]# iptables -P FORWARD ACCEPT
然后再ping以下node01的容器,发现网络已经通了
/ # ping -c1 -W1 172.18.17.2
PING 172.18.17.2 (172.18.17.2): 56 data bytes
64 bytes from 172.18.17.2: seq=0 ttl=60 time=2.199 ms
--- 172.18.17.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 2.199/2.199/2.199 ms
但是网络延迟比udp模式的延迟要低很多
5.如何一眼分辨是vxlan模式网络,还是udp模式网络
Vxlan模式的网络网卡名为flannel.1而udp模式的名字为flannel.0
6.为什么修改flannel网络后重启docker才生效
因为flannel会生成/var/run/flannel/docker的配置文件
[root@k8s-node02 ~]# cat /var/run/flannel/docker
DOCKER_OPT_BIP="--bip=172.18.28.1/24"###docker网段信息
DOCKER_OPT_IPMASQ="--ip-masq=true"
DOCKER_OPT_MTU="--mtu=1450"
DOCKER_NETWORK_OPTIONS=" --bip=172.18.28.1/24 --ip-masq=true --mtu=1450"

可以看到docker的启动参数多了点东西
####那为什么重启就多了这几行参数呢?
[root@k8s-node01 ~]# cat /usr/lib/systemd/system/docker.service.d/flannel.conf
[Service]
EnvironmentFile=-/run/flannel/docker###加载这个文件
##可以看到这个文件是flannel生成的
[root@k8s-node01 ~]# rpm -qf /usr/lib/systemd/system/docker.service.d/flannel.conf
flannel-0.7.1-4.el7.x86_64

Docker的启动文件中会加载flannel生成的run文件中的环境变量
7.为什么不修改iptables规则会ping不通其他主机的容器
安装docker之前,iptables的规则是十分干净的,但是安装之后,docker会修改iptables的规则,拒绝了数据包的转发,需要将规则改为允许

但是这个是临时生效的,如果重启docker,规则又会被修改为拒绝,那有没有一劳永逸的配置呢?
在docker的启动文件的service里添加如下一行,意思是在启动后做的动作是修改iptables的配置文件
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
4.配置master为镜像仓库
为了节省资源,这里用master节点兼职私有仓库,因为haber占用资源多,所以私有仓库选择register搭建
1.Master节点配置
[root@k8s-master ~]# yum -y install docker
[root@k8s-master ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],###加速地址
"insecure-registries": ["10.0.0.11:5000"]####信任这个私有仓库,不然走https协议
}
[root@k8s-master ~]# systemctl restart docker
[root@k8s-master ~]# systemctl enable docker
[root@k8s-master ~]# docker pull registry###拉取私有仓库镜像
[root@k8s-master ~]#docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry##启动私有仓库容器
2.node节点配置信任私有仓库地址及测试
[root@k8s-node02 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
[root@k8s-node02 ~]# systemctl restart docker
[root@k8s-node02 ~]# docker tag docker.io/alpine:latest 10.0.0.11:5000/sunfuyang/alpine:latest
[root@k8s-node02 ~]# docker push 10.0.0.11:5000/sunfuyang/alpine:latest
未经允许不得转载:孙某某的运维之路 » 1.k8s基本介绍及k8s集群安装部署
评论已关闭