kubernetes1.9.2基于kubeadm高可用安装教程,包含离线安装包,支持简单快速安装,含视频教程

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 使用kubeadm安装安全高可用kubernetes集群 安装包地址 如非高可用安装请忽略此教程,直接看产品页的三步安装。 单个master流程: 单master视频教程 解压后在master 上 cd shell && sh init.sh ,然后sh master.sh(注意因为脚本用的相对路径所以不再当前目录会找不到文件) 在node上 cd shell && sh init.sh 。

使用kubeadm安装安全高可用kubernetes集群

安装包地址 如非高可用安装请忽略此教程,直接看 产品页的三步安装。

单个master流程: 单master视频教程
  1. 解压后在master 上 cd shell && sh init.sh ,然后sh master.sh(注意因为脚本用的相对路径所以不再当前目录会找不到文件)
  2. 在node上 cd shell && sh init.sh 。然后在node上执行master输出的join命令即可
高可用如下

提前准备

假设构建一个3master+2node的k8s集群,需要5台节点共同的条件如下:

  1. yum install -y docker是1.12.6版本需要改cg
    17.06安装教程:

    #0.删除老旧的
    $ yum remove -y docker* #如果默认之前yum安装的1.12版本,可以这样删没装可以跳过此步 #1.安装需要的包
    $ yum install -y yum-utils \
     device-mapper-persistent-data \
     lvm2
     
    #2.添加源,不然默认的找不到
    $ yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo
     
    #3.根据实际查找当前版本 (可选)
    $ yum list docker-ce --showduplicates | sort -r
    #4.如果确定了版本,直接安装,如果要装17。03直接修改下面数字即可
    $ yum install docker-ce-17.06.1.ce # 主意版本填写包名的格式. #5.开启docker服务,和开机启动
    $ systemctl start docker && systemctl enable docker
    AI 代码解读
  2. 建议二进制方法提前部署好docker-compose,步骤参考后文
  3. 建议永久关闭selinux和swap以免后续问题
  4. 建议停止并关闭firewalld/iptables等防火墙
  5. 新的节点启动后记得改网络名 hostnamectl set-hostname masterX
  6. 节点之间要能互通内网环境稳定
  7. 安装中出了问题要看日志journalctl -n 10 ,运行中的日志查看tail -f 10 /var/log/messages

系统架构图

 kubectl dashboard
 |
 V 
 +------------------------+ join
 | LB 10.1.245.94 | <--- Nodes
 +------------------------+
 | 
 |--master1 manager1 schedule1 10.1.245.93 
 |--master2 manager2 schedule2 10.1.245.95 =============> etcd cluster http://10.1.245.93:2379,http://10.1.245.94:2379,http://10.1.245.95:2379
 |--master3 manager3 schedule3 10.1.245.94 
AI 代码解读

安装包介绍

解压完之后看到如下目录:

├── bin 所需要的k8s相关的bin文件
│ ├── kubeadm
│ ├── kubectl
│ └── kubelet
├── image 依赖的所有镜像包
│ └── images.tar
├── out 所有的配置文件
│ ├── dashboard dashboard相关配置
│ │ ├── dashboard-admin.yaml
│ │ └── kubernetes-dashboard.yaml
│ ├── etcd etcd相关配置
│ │ ├── etcd-docker-compose-0.yml
│ │ ├── etcd-docker-compose-1.yml
│ │ └── etcd-docker-compose-2.yml
│ ├── haproxy haproxy相关配置
│ │ └── haproxy.cfg
│ ├── heapster heapster相关yaml配置
│ │ ├── influxdb
│ │ │ ├── grafana.yaml
│ │ │ ├── heapster.yaml
│ │ │ └── influxdb.yaml
│ │ └── rbac
│ │ └── heapster-rbac.yaml
│ ├── kube k8s自身配置
│ │ ├── 10-kubeadm.conf
│ │ ├── config kubeadm配置
│ │ └── kubelet.service
│ ├── kubeinit.json 忽略
│ └── net 网络相关配置
│ ├── calico.yaml
│ └── calicoctl.yaml
└── shell 初始化脚本
 ├── init.sh 初始化节点,安装bin文件,systemd配置等
 └── master.sh 执行kubeadm init和其它组件
AI 代码解读

初始化节点

因为解压后包,然后scp -r xxx root@ip:/root 的方式分发解压后的包到其他节点

集群中所有节点都需要执行cd shell && sh init.sh (如果只跑单个master那么还需要执行 sh master.sh ,多master勿跑 )

有以下需要注意的事项:
  1. 修改init.sh脚本在后面添加,如果二进制程序没可执行权限chmod +x /usr/bin/kube*
  2. cgroups驱动需要选择docker17.0x版本,就不需要去调整了,如果是1.1x版本的docker需要手动修改kubelet的启动文件里面的cgroups配置为systemd (修改位置/etc/systemd/system/kubelet.service.d) 与 docker info|grep Cg一致
  3. 提前修改默认的init 或者手动执行sysctl -w net.ipv4.ip_forward=1 不然第七行报错

执行完成后通过命令查看kubectl get pod -n kube-system ,状态全为Running正常

起动etcd集群

etcd集群安装使用docker-compose方式部署

A.使用docker-compose启动,如果没装:

$ pip install docker-compose
AI 代码解读

B.使用二进制包启动docker-compose(离线可选)

$ wget https://github.com/docker/compose/releases/download/1.18.0/docker-compose-Linux-x86_64 #官方推荐是用curl,不建议
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose && chmod a+x /usr/local/bin/docker-compose #也有写+x的. #这样就完成了,测试
$ docker-compose version #下面是正常输出
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
AI 代码解读

在out/etcd目录下有相关模板etcd-docker-compose-x.yam,启动多个节点时修改成自己的ip地址 其它两个节点照抄,修改ip即可, image那行 应改为 gcr.io/google_containers/etcd-amd64:3.1.11,实际就是版本号改一下即可。

#需要修改所有含有ip的地方,下面的9,10,11,12行改为当前节点ip,15行三个ip顺序改为etcd集群部署的三台节点ip version: '2.1'
services:
 etcd0:
 container_name: etcd_infra0
 image: gcr.io/google_containers/etcd-amd64:3.0.17 #这里最后改为3.1.11
 command: |
 etcd --name infra0 --initial-advertisie-peer-urls http://10.230.204.160:2380 --listen-peer-urls http://10.230.204.160:2380 --listen-client-urls http://10.230.204.160:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.230.204.160:2379 --data-dir /etcd-data.etcd --initial-cluster-token etcd-cluster-1 --initial-cluster infra0=http://10.230.204.160:2380,infra1=http://10.230.204.165:2380,infra2=http://10.230.204.151:2380 --initial-cluster-state new
 restart: always
 volumes:
 - /data/etcd-data.etcd:/etcd-data.etcd
 network_mode: "host"
AI 代码解读

三个节点分别启动:

$ docker-compose -f out/etcd/etcd-docker-compose-x.yml up -d 
#正常输出Creating etcd_infrax ... done x为每个etcd编号
AI 代码解读

检查是不是安装成功:

$ docker exec etcd_infra0 etcdctl member list #master1上可能运行报错容易提示容器正在重启。。原因暂时未知,其他master上可以 #成功应该是类似显示
5ded6dd284b89d31: name=infra1 peerURLs=http://10.230.204.153:2380 clientURLs=http://10.230.204.153:2379 isLeader=true
6d4b5eee32c1497a: name=infra0 peerURLs=http://10.230.204.150:2380 clientURLs=http://10.230.204.150:2379 isLeader=false
729d9cd56debb1a1: name=infra2 peerURLs=http://10.230.204.154:2380 clientURLs=http://10.230.204.154:2379 isLeader=false #如果出现有peerURL不显示说明没有成功,尝试remove重新创建
$ docker-compose -f out/etcd/etcd-docker-compose-x.yml down -v
AI 代码解读

kubeadm配置

修改配置 out/kube/config 文件

apiVersion: kubeadm.k8s.io/v1alpha1 kind: MasterConfiguration apiServerCertSANs: #此处填所有的masterip和lbip和其它你可能需要通过它访问apiserver的地址和域名或者主机名等,如阿里fip,证书中会允许这些ip - 172.31.244.231 - 172.31.244.232 - 172.31.244.233 - 172.31.244.234 - master1 - master2 - master3 - node1 - 47.75.1.72 etcd: endpoints: #这里填之前安装的etcd集群地址列表,修改IP地址 - http://172.31.244.232:2379 - http://172.31.244.233:2379 - http://172.31.244.234:2379 apiServerExtraArgs: endpoint-reconciler-type: lease networking: podSubnet: 192.168.0.0/16 #不用改 kubernetesVersion: v1.9.2 #不用改 featureGates: #不用改 CoreDNS: true
AI 代码解读

然后执行:

$ kubeadm init --config out/kube/config
AI 代码解读

把成功后的kubeadm join命令存在文件里,那东西不能丢了

启动calico等

mkdir ~/.kube && cp /etc/kubernetes/admin.conf ~/.kube/config (如果已经存在请校验一下是否相同,不确定建议删掉重新cp过去)

修改calico配置,把etcd地址换成你安装好的集群地址:
out/net/calico.yaml:

kind: ConfigMap apiVersion: v1 metadata: name: calico-config namespace: kube-system data:  # The location of your etcd cluster. This uses the Service clusterIP  # defined below. etcd_endpoints: "http://10.96.232.136:6666" # 这里改成etcd集群地址如 "http://172.31.244.232:2379,http://172.31.244.233:2379,http://172.31.244.234:2379"
AI 代码解读
$ kubectl apply -f out/net/calico.yaml
$ kubectl apply -f out/heapster/influxdb
$ kubectl apply -f out/heapster/rbac
$ kubectl apply -f out/dashboard
#上面命令可整合为
$ kubectl apply -f out/net/calico.yaml -f out/heapster/influxdb -f out/heapster/rbac -f out/dashboard
AI 代码解读
  1. 然后访问https://master1IP:32000端口即可,在chrome下无法进入提示证书有误,更换firefox可以,提示说证书日期不对(待修复)

启动多个master

第一个master我们称之为master0 (假设其他master已经init.sh过),现在把第一个master的/etc/kubernetes/pki目录拷贝到别的master节点上

$ mkdir -p /etc/kubernetes
$ scp -r /etc/kubernetes/pki root@10.1.245.93:/etc/kubernetes/pki
AI 代码解读

删除pki目录下的apiserver.crt 和 apiserver.key文件rm -rf apiserver.crt apiserver.key,注意如果不删除会只能看到一个master,是不正常的。

同样使用master0上的out/kube/config文件,复制内容,拷贝到master1上,scp out/kube/config root@10.230.204.151:/root/ 执行kubeadm init --config ~/config

master2节点同master1

启动loadbalance

我比较推荐使用四层代理 HAproxy配置out/haproxy目录:

vi out/haproxy/haproxy.cfg

global
 daemon
 log 127.0.0.1 local0
 log 127.0.0.1 local1 notice
 maxconn 4096

defaults
 log global
 retries 3
 maxconn 2000
 timeout connect 5s
 timeout client 50s
 timeout server 50s

frontend k8s
 bind *:6444
 mode tcp
 default_backend k8s-backend

backend k8s-backend
 balance roundrobin
 mode tcp
 #下面三个ip替换成三个你自己master的地址
 server k8s-1 10.1.245.93:6443 check 
 server k8s-1 10.1.245.94:6443 check
 server k8s-2 10.1.245.95:6443 check
AI 代码解读

mkdir /etc/haproxy 然后把这个文件拷贝在cp out/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg

$ docker run --net=host -v /etc/haproxy:/usr/local/etc/haproxy --name ha -d haproxy:1.7
AI 代码解读

修改kubeproxy配置

$ kubectl -n kube-system edit configmap kube-proxy
AI 代码解读

找到master地址,修改成LB地址,6444端口 (这里关键在于怎么知道LB的地址到底是哪一个呀?上面配置之后三个masterIP 轮询并不知道哪个是LB地址)

#找到文件的这一块,第七行server 有个ip地址 apiVersion: v1
 kind: Config
 clusters:
 - cluster:
 certificate-authority: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
 server: https://10.230.204.151:6443 #修改为 LoadBalanceIP:6444
 name: default
 contexts:
 - context:
 cluster: default
 namespace: default
 user: default
 name: default
 current-context: default
 users:
 - name: default
 user:
 tokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
AI 代码解读

join node节点

还是在node节点执行第一个master输出的命令

$ kubeadm join --token <token> 10.1.245.94:6443 --discovery-token-ca-cert-hash sha256:<hash>
AI 代码解读

修改node节点kubelet配置

vi /etc/kubernetes/kubelet.conf 同样把地址修改成LB地址,如:10.1.245.94:6444 ,修改如下第五行(展示的例子已经修改过)

apiVersion: v1
clusters:
- cluster:
 certificate-authority-data: xxxxxx #此处省略几百字符
 server: https://10.230.204.160:6444 #修改这里为LB:6444,原本是另外的ip:6443
 name: default-cluster
contexts:
- context:
 cluster: default-cluster
 namespace: default
 user: default-auth
 name: default-context
current-context: default-context
AI 代码解读

kubectl配置

修改~/.kube/config文件,server的ip改成LB的ip 10.1.245.94:6444

或者通过命令修改:

$ kubectl config set-cluster kubernetes --server=https://47.52.227.242:6444 --kubeconfig=$HOME/.kube/config
AI 代码解读

启动多DNS副本

$ kubectl edit deploy coredns -n kube-system
AI 代码解读

replicas: 3

[root@master1 ~]$ kubectl get pod -n kube-system -o wide|grep core
coredns-65dcdb4cf-4j5s8 1/1 Running 0 39m 192.168.137.65 master1
coredns-65dcdb4cf-ngx4h 1/1 Running 0 38s 192.168.180.1 master2
coredns-65dcdb4cf-qbsr6 1/1 Running 0 38s 192.168.166.132 node1
AI 代码解读

这样,启动了三个dns

验证与测试

$ kubectl run test --image busybox sleep 10000
$ kubectl exec your-busybox-pod-name nslookup kubernetes
AI 代码解读

杀非LB的master,多次测试看创建pod与dns是否正常,还可以telnet 10.96.0.1 443 去验证clusterip是否正常

本文转自SegmentFault-kubernetes1.9.2基于kubeadm高可用安装教程,包含离线安装包,支持简单快速安装,含视频教程

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
2025 超详细!Lens Kubernetes IDE 多平台下载安装与集群管理教程
Lens 是一款企业级 Kubernetes 可视化操作平台,2025版实现了三大技术革新:AI智能运维(异常检测准确率98.7%)、多云联邦管理(支持50+集群)和实时3D拓扑展示。本文介绍其安装环境、配置流程、核心功能及高阶技巧,帮助用户快速上手并解决常见问题。适用于 Windows、macOS 和 Ubuntu 系统,需满足最低配置要求并前置依赖组件如 kubectl 和 Helm。通过 Global Cluster Hub 实现多集群管理,AI辅助故障诊断提升运维效率,自定义监控看板和插件生态扩展提供更多功能。
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
23 11
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
179 12
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
1033 11
阿里云 ACK 高可用稳定性最佳实践
本文整理自2024云栖大会刘佳旭的演讲,主题为《ACK高可用稳定性最佳实践》。文章探讨了云原生高可用架构的重要性,通过Kubernetes的高可用案例分析,介绍了ACK在单集群高可用架构设计、产品能力和最佳实践方面的方法,包括控制面和数据面的高可用策略、工作负载高可用配置、企业版容器镜像服务高可用配置等内容,旨在帮助企业构建更加可靠和高效的应用运行环境。
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
223 3
从0开始搞K8S:使用Ubuntu进行安装(环境安装)
通过上述步骤,你已经在Ubuntu上成功搭建了一个基本的Kubernetes单节点集群。这只是开始,Kubernetes的世界广阔且深邃,接下来你可以尝试部署应用、了解Kubernetes的高级概念如Services、Deployments、Ingress等,以及探索如何利用Helm等工具进行应用管理,逐步提升你的Kubernetes技能树。记住,实践是最好的老师,不断实验与学习,你将逐渐掌握这一强大的容器编排技术。
829 1
OpenAI故障复盘丨如何保障大规模K8s集群稳定性
OpenAI故障复盘丨如何保障大规模K8s集群稳定性

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等