CentOS7安装k8s-v1.13.4
- 第一部分 环境初始化
- 环境准备:
- 设置SSH免密码登录
- 配置内核参数
- 安装Docker(各个节点都要)
- 证书制作
- 下载并安装CFSSL
- 创建CA证书
- 创建ETCD证书
- 创建kubernetes证书
- 创建admin证书
- 创建kube-proxy证书
- 创建Flannel证书
- ETCD集群部署
- 准备ETCD软件
- 配置ETCD参数
- 创建ETCD数据目录
- 创建ETCD系统服务
- 修改k8s-worker1的etcd.conf文件
- 修改k8s-worker2的etcd.conf文件
- 加载并启动系统服务
- 验证集群
- Master节点部署
- 准备kubernetes软件包
- 部署Kubernetes API Server
- 部署Controller Manager服务
- 部署Kubernetes Scheduler
- 部署kubectl 命令行工具
- Node节点部署
- 部署kubelet
- 部署Kubernetes Proxy
- Flannel网络部署
- 部署flannel软件包
- 配置flannel
- 创建Flannel系统服务
- 安装CNI插件
- CoreDNS和Dashboard部署
- 部署CoreDNS
- 部署Dashboard
以上系统最小化安装,修改好主机名,禁用selinux,关闭防火墙,并写好/etc/hosts:
这里k8s-master1兼作部署节点:
修改CA配置文件
修改CA请求文件
将证书复制到/opt/kubernetes/ssl目录下:
查看校验证书:
文件分发到两个worker节点
创建ETCD数据目录
创建ETCD数据目录
在所有节点上:
登录https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md,选择相应的版本下载:
或者手工下载指定软件包
还有client和node版的,不需要下载了,server版的已经全包含进来了。
解压kubernetes-server-linux-amd64.tar.gz并拷贝到适当的目录:
创建 kube-apiserver 使用的客户端 token 文件
在token-auth.csv中拥有以列为单位的认证信息,格式为token,username,uid
创建基础用户名/密码认证配置
格式为:密码,用户名,ui,为后面创建dashborad后用户认证。
启动API Server服务
查看API版本
启动Controller Manager
启动Kubernetes Scheduler
配置命令补全:
命令kubectl在默认情况下(即未指定–kubeconfig=参数时),会到\(HOME/.kube目录下寻找名为config的配置文件,配置文件中包含集群ip地址、端口号、用户名、密码、证书、名称空间等信息,kubectl据此建构访问集群的上下文。以下命令kubectl config均未指定–kubeconfig=参数。</p><p>设置集群参数</p><div></div><p>设置客户端认证参数</p><div></div><p>设置上下文参数</p><div></div><p>设置默认上下文</p><div></div><p>查看kubeconfig内容</p><div></div><p>验证master节点功能</p><div></div><p>准备部署node节点<br> 将相关软件包复制到node节点中</p><div></div><p>创建角色绑定</p><div></div><p>创建kubeconfig 文件,设置集群参数</p><div></div><p>设置客户端认证参数,token值为之前生成的</p><div></div><p>设置上下文参数</p><div></div><p>选择默认上下文并向node节点分发在master端生成的</p><div></div><p>Node节点是Kubernetes集群中的工作负载节点,每个node都会被master分配一些工作负载,每个node节点都运行以下关键服务进程:<br> Kubelet:负责pod对应的容器的创建、启停等任务,同时与master节点密切协作,实现集群管理的基本功能。<br> Kube-proxy:实现kubernetes service的通信与负载均衡机制的重要组件。<br> Docker Engine(docker):Docker引擎,负责本机的容器创建和管理工作。</p><p>在k8s集群中,每个Node节点都会启动kubelet进程,用来处理Master节点下发到本节点的任务,管理Pod和pod中的容器。kubelet会在API Server上注册节点信息,定期向Master汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源。<br> 设置CNI支持</p><div></div><p>创建kubelet服务配置</p><div></div><p>启动Kubelet</p><div></div><p>查看csr请求(注意是在k8s-maste上执行)</p><div></div><p>批准kubelet 的 TLS 证书请求</p><div></div><p>执行完毕后,查看节点状态如果是Ready的状态就说明一切正常:</p><div></div><p>从Kubernetes 1.12版本起,kube-proxy服务默认使用ipvs实现,取消了之前的iptables。这有助于提升K8s大规模集群环境下的性能和稳定性。<br> 配置kube-proxy使用IPVS</p><div></div><p>创建kube-proxy服务配置</p><div></div><p>虽然status结果显示绿色的active (running),但也存在问题:</p><div></div><p>检查LVS状态</p><div></div><p>至此,在k8s-worker1节点上部署Kubelet和proxy完成,在K8s-worker2上重复上述过程,部署完后,回到k8s-master1节点上查看集群状态:</p><div></div><p>因为Master中没有装kubelet,所以kubectl get nodes就看不到Master的。<br> 给节点打标签:</p><div></div><div></div><div></div><div></div><p>mk-docker-opts.sh 脚本将分配给 flanneld 的 Pod 子网网段信息写入 /run/flannel/docker 文件,后续 docker 启动时使用这个文件中的环境变量配置 docker0 网桥;<br> flanneld 使用系统缺省路由所在的接口与其它节点通信,对于有多个网络接口(如内网和公网)的节点,可以用 -iface 参数指定通信接口,如上面的 eth0 接口;<br> flanneld 运行时需要 root 权限;<br> 复制配置文件到其它节点</p><div></div><p>CNI插件官网:</p><div></div><p>在master节点创建Etcd的key</p><div></div><p>启动flannel</p><div></div><p>查看网络配置</p><div></div><p>查看路由</p><div></div><p>flannel服务启动时主要做了以下几步的工作:<br> 从etcd中获取network的配置信息<br> 划分subnet,并在etcd中进行注册<br> 将子网信息记录到/run/flannel/subnet.env中</p><div></div><p>之后将会有一个脚本将subnet.env转写成一个docker的环境变量文件/run/flannel/docker</p><div></div><p>配置Docker使用Flannel<br> 在Unit段中的After后面添加flannel.service参数,在Wants下面添加Requires=flannel.service.<br> [Service]段中Type后面添加EnvironmentFile=-/run/flannel/docker段,在ExecStart后面添加\)DOCKER_OPTS参数
配置如下:
将配置分发到另外两个节点中(源和目标机器都要安装rsync)
所有节点重启Docker服务
运行ip a命令,如果docker0和flannel.1在一个网段,则表示正常:
查看主机路由表:
都14分钟了还没下载完nginx镜像?有问题,查看事件:
可以看到是pause-amd64这个镜像拉取不下来,切换到node节点,从阿里云上拉取再改名:
节点k8s-worker2上做同样的操作。
可以看到两个容器,一个是nginx,一个是pause-amd64。
到k8s-master1上查看pod的IP:
测试连通性:
暴露服务,创建service
这个external-ip就是某个node节点的对外IP。
至此,kubernetes集群大功告成。
删除pod:
下面的curl命令,分别返回集群中的Pod列表、Service列表、RC列表:
创建coredns服务:
状态ImagePullBackOff,查看事件:
过一会就能看到pod是running状态了。
下载dashborad文件地址,大神已经修改好了我们直接执行就可以:
访问dashboard的方式有三种:
通过kube-apiserver访问,见前面kubectl cluster-info输出;
通过 kubectl proxy 访问;
通过http://NodeIP:nodePort访问;
查看dashborad对外映射端口
将token:一行后面的内容复制到令牌里,即可登录仪表板。
部署traefik Ingress
理解Ingress
简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apache等负载均衡方向代理服务器,其中还包括规则定义,即URL的路由信息,路由信息得的刷新由Ingress controller来提供。
部署Traefik Ingress
本文将采用daemonset方式部署Traefik Ingress来进行服务发布。
部署Traefik的配置文件可以在如下github仓库中找到:
https://github.com/rootsongjc/kubernetes-handbook/tree/master/manifests/traefik-ingress
下载相关yaml文件:
其中,ingress-rbac.yaml用于service account验证,不需要修改,内容如下:
通过DaemonSet方式部署Traefik服务:
其中 traefik 监听 node 的 80 和 8580 端口,80 提供正常服务,8580 是其自带的 UI 界面,原本默认是 8080,因为环境里端口冲突了,所以这里临时改一下。
Traefik UI部署
有新service增加时,修改该文件后可以使用kubectl replace -f ingress.yaml来更新。
查看traefik关联了哪些服务:
也可通过UI:http://10.3.8.104:8580/dashboard/ 查看traefik关联了哪些服务:
如果在kubernetes集群以外访问就需要设置DNS,或者修改本机的hosts文件,在其中加入:
10.3.8.104 mynginx.linuxs.top
10.3.8.104 whatsmyip.linuxs.top
浏览器访问mynginx.linuxs.top:
浏览器访问whatsmyip.linuxs.top:
刷新一下就能看到轮询到另一个服务:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/201137.html