kubernetes 实战 1:使用 kubeadm 创建高可用集群
最近两年kubernetes越来越火热,生态圈越来越强大,朋友圈也经常有朋友发一些kubernetes的文章,周末闲着也是闲着,也写点东西吧,从集群的安装、监控、日志收集、CI/CD以及其它生产环境中一些场景,文章还是以实战内容为主。
k8s 集群主要有以下几个组件:
-
etcd: 一款分布式的一致性KV存储存储和服务发现系统,存储了整个集群的状态
-
kube-apiserver: 提供kubernetes集群的API调用
-
kube-controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
-
kube-scheduler:负责资源的调度
-
kubelet:负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理
-
kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡
-
Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)
-
flannel: 一款网络插件,集群中的pod通讯主要依赖于它
-
coredns: 负责为整个集群提供DNS服务
一. 环境和版本信息
OS: CentOS 7.6.1810 HAProxy Vervion: 1.5.18 Docker Version: Docker-CE 18.09.1 Kubetnetes Version: v1.15.1 HAProxy: 192.168.199.200 Control-plane Node(master node): node-01: 192.168.199.201 node-02: 192.168.199.202 node-03: 192.168.199.203 Worker Node: node-04: 192.168.199.204 node-05: 192.168.199.205 node-06: 192.168.199.206
二. 系统配置:
1. 关闭防火墙
sudo systemctl stop firewalld sudo systemctl disable firewalld
2. 关闭selinux
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
3. 关闭swap
sudo swapoff -a
注释swap挂载,如下图:
三. 安装docker、kubeadm、kubelet、kubectl
1. 安装docker-ce
-
安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
添加 yum 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
安装 docker-ce
sudo yum install -y docker-ce-18.09.1-3.el7
-
官方推荐修改 cgroup driver 为 systemd,更稳定,详见:https://kubernetes.io/docs/setup/cri
mkdir /etc/docker cat <<EOF > /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } EOF systemctl restart docker systemctl enable docker
2. 配置 CNI插件(flannel) 所需的iptables转发参数
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl -p /etc/sysctl.d/k8s.conf
3. 安装kubeadm、kubelet、kubectl
-
官方 yum 源国内访问不了,这里添加阿里云 yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes Repo baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ gpgcheck=0 enabled=1 EOF
-
yum 安装
sudo yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1 --disableexcludes=kubernetes systemctl enable kubelet
提示:上面步骤二 和 步骤三 所有k8s节点都需要执行
四. 安装haproxy
1. 配置 kube-apiserver 高可用需要一个负载均衡器,这里直接使用了一个单节点 haproxy 代替一下,实际生产环境中使用 keepalived 保证 haproxy 的高可用
sudo yum install -y haproxy
2. 将 master node 的 kube-apiserver 的 6443 添加到 haproxy做负载均衡
vi /etc/haproxy/haproxy.cfg frontend k8s_apiserver *:6443 mode tcp default_backend k8s backend k8s mode tcp balance roundrobin server node-01 192.168.199.201:6443 check server node-02 192.168.199.202:6443 check server node-03 192.168.199.203:6443 check
3. reload 应用配置
systemctl reload haproxy
4. 查看6443端口是否已经在监听状态
五. 安装 master node
1. 创建 kubeadm 配置文件
cat <<EOF > kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: v1.15.1 controlPlaneEndpoint: "192.168.199.200:6443" imageRepository: "registry.aliyuncs.com/google_containers" networking: podSubnet: "10.244.0.0/16" apiServer: certSANs: - "k8s.mytest.com" EOF
# controlPlaneEndpoint haproxy 的负载均衡监听地址 # imageRepository 默认使用gcr.io镜像站,国内访问不了,这里指定从阿里云的镜像站拉镜像
2. 初始化集群
sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
-
初始化成功,记录下最后提示的 kubeadm join xxx 命令, 第一个是往集群添加master node,第二个是往集群添加 worker node
3. 为 kubectl 配置kube-config
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
4. 安装 CNI插件 flannel
wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
-
默认是从quay.io拉取flannel镜像,但是经常因为网络原因拉不了,这里从阿里云找了一个替换了一下
sed -i s#'quay.io/coreos/flannel:v0.11.0-amd64'#'registry.cn-hangzhou.aliyuncs.com/mygcrio/flannel:v0.11.0-amd64'#g kube-flannel.yml kubectl apply -f kube-flannel.yml
5. 使用上面记录的kubeadm jion ... 命令将另外两个master节点(node-02,node-03)添加进集群
kubeadm join 192.168.199.200:6443 --token ax13yr.yzsps775bllh0mlo \ --discovery-token-ca-cert-hash sha256:07b2b093be7ddabe7372b2c765b20343aa92f67db99286be1dc46b867a330f95 \ --control-plane --certificate-key b68cd457e26c827994c9804f8adf7a22720aba5a5e9f8e4e487a587b2c2fc127
6. 查看etcd 集群状态
docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes \ registry.aliyuncs.com/google_containers/etcd:3.3.10 etcdctl \ --cert-file /etc/kubernetes/pki/etcd/peer.crt \ --key-file /etc/kubernetes/pki/etcd/peer.key \ --ca-file /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://192.168.199.201:2379 cluster-health
-
图中可以看出etcd 集群健康状态正常,到这里master node基本已经安装结束,下面开始添加worker node。
六. 添加 worker node
1. 执行 步骤 1.系统配置 和 步骤 2.安装docker、kubeadm、kubelet
2. 执行集群初始化完成后记录的第二条 kubeadm join ... 命令:
kubeadm join 192.168.199.200:6443 --token ax13yr.yzsps775bllh0mlo \ --discovery-token-ca-cert-hash sha256:07b2b093be7ddabe7372b2c765b20343aa92f67db99286be1dc46b867a330f95
七. 检查集群
1. 查看node
-
各节点状态正常,如果有节点状态为 NotReady,有可能是该节点还未完全初始化成功,可以稍等片刻再查看是否正常。
-
如果想将 master node 同时当做 worker node使用,执行如下命令即可:
kubectl taint nodes --all node-role.kubernetes.io/master-
2. 查看 pod
-
如果有系统组件pod状态异常,使用 kubectl describe pod xxx 查看详细信息。
八. add-ons
-
dashboard 提供集群的GUI
-
metrics server 提供资源监控(heapster 目前已经被官方弃用)
1. 安装 dashboard
-
生产环境中使用 dashboard 推荐使用 HTTPS,证书获取这里就不写了,可以到阿里云申请免费的DV证书或者 let's encrypt也可以,我这里使用 acme 申请了一个 let's encrypt 的证书,我这里证书文件放在了 $HOME/certs 目录下,里面包含dashboard.crt、dashboard.key两个证书文件;
-
导入证书
kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
-
下载和修改部署官方yaml文件的image,官方的镜像站 k8s.gcr.io 访问不了~访问不了~访问不了~~~
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml sed -i s#'k8s.gcr.io/kubernetes-dashboard-amd64'#'registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64'#g kubernetes-dashboard.yaml
-
部署
kubectl create -f kubernetes-dashboard.yaml
-
查看 pod 是否已经 running
kubectl get pods -n kube-system
-
创建完成后我们还不能直接访问dashboard,因为 dashboard 服务还没暴露出来,生产中一般使用 ingress 对外服务,这里我们先用 nodeport 方式暴露出来,下篇文章会写到 ingress 的使用;
kubectl expose svc kubernetes-dashboard --port=443 --target-port=8443 --type=NodePort --name=test-dashboard -n kube-system
-
查看 service test-dashboard 的 nodeport 端口号:
kubectl describe svc test-dashboard -n kube-system
-
使用任意节点 ip:端口号 访问;使用ip可能会提示非安全访问,因为访问的域名和签名申请的证书域名不一致导致,这里先选择继续访问即可,后续写到 ingress 的时候也会解决
-
已经安装成功,但是还需创建一个管理员用户登录:
vi admin-user.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kube-system
-
查看 token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
-
登录dashboard
2. 安装 metrics-server
-
拉取 metrics-server 仓库
git clone https://github.com/kubernetes-incubator/metrics-server.git
-
部署,官方image还是下载不了,替换image
sed -i s#'k8s.gcr.io'#'registry.aliyuncs.com/google_containers'#g metrics-server/deploy/1.8+/metrics-server-deployment.yaml kubectl create -f metrics-server/deploy/1.8+/
-
确定 pod 已经 running
kubectl get pods -n kube-system
-
编辑 deployment, 添加参数:
args: - --kubelet-insecure-tls - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
-
成功获取cpu和内存指标,如果出现 "error: metrics not available yet", 那就稍等几分钟再试,metrics server 需要采集指标数据
参考:
-
官方文档
-
kubernetes-handbook
下一篇主题:Traefik 安装和使用
关注 公众号 “运维实战笔记” 获取最新文章
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
看!闲鱼又开源了一个 Flutter 开发利器
阿里妹导读:随着 Flutter 这一框架的快速发展,有越来越多的业务开始使用 Flutter 来重构或新建其产品。但在我们的实践过程中发现,一方面 Flutter 开发效率高,性能优异,跨平台表现好,另一方面 Flutter 也面临着插件,基础能力,底层框架缺失或者不完善等问题。今天,闲鱼团队的正物带我们解决一个问题:如何解决 AOP for Flutter? 问题背景 我们在实现一个自动化录制回放的过程中发现,需要去修改 Flutter 框架( Dart 层面)的代码才能够满足要求,这就会有了对框架的侵入性。要解决这种侵入性的问题,更好地减少迭代过程中的维护成本,我们考虑的首要方案即面向切面编程。 那么如何解决 AOP for Flutter 这个问题呢?本文将重点介绍一个闲鱼技术团队开发的针对 Dart 的 AOP 编程框架 AspectD。 AspectD:面向 Dart 的 AOP 框架 AOP 能力究竟是运行时还是编译时支持依赖于语言本身的特点。举例来说在 iOS 中,Objective C 本身提供了强大的运行时和动态性使得运行期 AOP 简单易用。在 Android下,...
- 下一篇
开发部署提速8倍!这款IDE插件了解一下?
对于开发者而言,提高工作效率大概有 2 种主要方式,第一种方式就是加快自己的工作速度,争取在同一段时间内多码一些代码、多干一些活来实现多产;而聪明的开发者会选择第二种方式,就是通过插件,让一些重复性的、繁琐性的工作被自动化,从而节省出时间来做一些实质性的业务,达到轻松又高效的工作步调。 最近通过发布会直播,了解到一款本地 IDE 插件——Cloud Toolkit,就是通过第二种方式来提高开发者的工作效率。它能够帮助开发者更高效地开发、测试、诊断并部署应用,还支持快速创建 Dubbo 工程等等,自去年 12 月上线以来,就超过几万的开发者在使用这款插件。(观看中间件小姐姐直播演示,请点击) 本文将为大家盘点,Cloud Toolkit 的最新几个版本都为开发者带来了哪些新特性。以下是本文提纲: 核心功能:一键部署应用 支持 Windows 服务器部署 支持 EDAS Kubernetes 集群部署 支持 SSH 代理(跳板机) 应用部署实时日志查看 快速创建开源 RPC 框架 Dubbo 工程 > 更详细的操作可见:https://help.aliyun.com/document...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7安装Docker,走上虚拟化容器引擎之路