kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,通过将集群的各个组件进行容器化安装管理,通过kubeadm的方式安装集群比二进制的方式安装要方便不少。

安装参考- https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

每一个节点主机上包括master节点都要手动安装并运行docker,同时也都要手动安装并运行kubelet。如果将第一个节点初始化为master节点,在执行初始化这个步骤,其实就是通过kubeadm工具将API Server、etcd、controller-manager、scheduler各组件运行为Pod,也就是跑在docker上。而其他node节点,因已经运行了kubelet、docker组件,剩下的kube-proxy组件也是要运行在Pod上。

kubeadm

K8S 组件构成

  • kubectl

  • kubeadm

  • K8s Master

    • kubelet
    • kube-proxy
    • kube-apiserver
    • kube-scheduler
    • kube-controller-manager
    • etcd
  • K8s Node

    • kubelet
    • kube-proxy
  • calico

  • coredns

环境准备 (以ubuntu系统为例)

1. kubernetes集群机器

机器IP 机器hostname K8s集群角色 机器操作系统
172.20.249.16 172-20-249-16 master ubuntu16.04
172.20.249.17 172-20-249-17 node ubuntu16.04
172.20.249.18 172-20-249-18 node ubuntu16.04

使用如下命令设置hostname: (非必须)

# 172.20.249.16
hostnamectl --static set-hostname k8s-master
# 172.20.249.17
hostnamectl --static set-hostname k8s-node-01
# 172.20.249.18
hostnamectl --static set-hostname k8s-node-02

Kubernetes v1.8+ 要求关闭系统 Swap,请在所有节点利用以下指令关闭 (否则kubelet会出错!)

swapoff -a && sed -i '/ swap / s/^/#/' /etc/fstab

2. 安装 docker、 kubeadm、kubelet、kubectl

2.1 在每台机器上安装 docker

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安装 Docker-CE (可指定版本)
sudo apt-get -y update
sudo apt-get -y install docker-ce sudo apt-get -y install docker-ce=17.03.0~ce-0~ubuntu-xenial

2.2 每台机器上安装 kubelet 、kubeadm 、kubectl

  • kubeadm: the command to bootstrap the cluster.
  • kubectl: the command line util to talk to your cluster
  • kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.
apt-get update && apt-get install -y apt-transport-https

# 安装 GPG 证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - # 写入软件源;注意:我们用系统代号为 bionic,但目前阿里云不支持,所以沿用 16.04 的 xenial
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF apt-get update apt-get install -y kubelet kubeadm kubectl # 指定版本
apt-get install -y kubelet=1.18.8-00 kubeadm=1.18.8-00 kubectl=1.18.8-00

创建 kubernetes 集群

kubeadm

kubeadm是一个构建k8s集群的工具。它提供的kubeadm initkubeadm join 两个命令是快速构建k8s集群的最佳实践。 其次,kubeadm工具只为构建最小可用集群,它只关心集群中最基础的组件,至于其他的插件(比如dashboard、CNI等)则不会涉及

  1. kubeadm init to bootstrap the initial Kubernetes control-plane node.

  2. kubeadm join to bootstrap a Kubernetes worker node or an additional control plane node, and join it to the cluster.

  3. kubeadm upgrade to upgrade a Kubernetes cluster to a newer version.

  4. kubeadm reset to revert any changes made to this host by kubeadm init or kubeadm join.

更多了解 kubeadm - https://www.cnblogs.com/shoufu/p/13047723.html

在 master 节点 init 集群

kubeadm 初始化整个集群的过程,会生成相关的各种证书、kubeconfig 文件、bootstraptoken 等等

注意: 如果使用直接使用kubeadm init,会使用默认配置(如下)

kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml 可打印默认配置

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 1.2.3.4
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
# 默认情况下kubeadm会到k8s.gcr.io拉取镜像,不过对于一些私有化部署(比如国内存在墙的情况下,上面的地址是访问不到的),就需要自定义镜像地址了 如: imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 # 添加该配置
serviceSubnet: 10.96.0.0/12
scheduler: {}

修改配置文件后, 执行命令 kubeadm init --config kubeadm.yml即可

或者 直接传递参数执行 (如下)

kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

#选择flannel作为 Pod 的网络插件,所以需要指定 --pod-network-cidr=10.244.0.0/16
#选择flannel作为 Pod 的网络插件,所以需要指定 --pod-network-cidr=192.168.0.0/16

参数说明:

--apiserver-advertise-address:这个参数指定了监听的API地址。若没有设置,则使用默认网络接口。

--apiserver-bind-port:这个参数指定了API服务器暴露出的端口号,默认是6443

--kubernetes-version:指定kubeadm安装的kubernetes版本。这个是很重要的,因为默认情况下kubeadm会安装与它版本相同的kubernetes版本

--image-repository 可以指定国内的镜像仓库。 默认k8s.gcr.io 国内无法访问

-- token-ttl:令牌被删除前的时间,默认是24h。kubeadm初始化完毕后会生成一个令牌,让其他节点能够加入集群,过时之后这个令牌会自动删除。如果设置为0之后令牌就永不过期

如下所示,kubeadm init 会 pull 必要的镜像,可能时间会比较长 (kubeadm config images pull 可测试是否可以拉取镜像,如果加了 --image-repository registry.aliyuncs.com/google_containers,不会担心在国内拉取镜像问题)

user@k8s-master:~$ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.18.9
k8s.gcr.io/kube-controller-manager:v1.18.9
k8s.gcr.io/kube-scheduler:v1.18.9
k8s.gcr.io/kube-proxy:v1.18.9
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

init 完后,可以看到如下提示:

按照提示在 master 节点执行以下命令: (否则会出错)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

此时, master 处于ready 状态

NAME         STATUS   ROLES    AGE   VERSION
k8s-master Ready master 14m v1.18.6

在worker 节点执行命令 join 到集群

拷贝在 master 节点 init 后的 join 命令,在其他两个 worker 节点执行:

kubeadm join 172.20.249.16:6443 --token cma8ob.ow9sfv5erqgkkp30 \
--discovery-token-ca-cert-hash sha256:def379576eacaddbb4bbf4ca12fbb8a0b77383e4521cbf238f21c8dd3cb80fab

可以看到该节点已经加入到集群中去了,然后我们把 master 节点的~/.kube/config文件拷贝到当前节点对应的位置即可使用 kubectl 命令行工具了。

mkdir -p $HOME/.kube
# copy master "/etc/kubernetes/admin.conf"
sudo scp root@172.20.249.16:/etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

要注意将上面的加入集群的命令保存下面,如果忘记,可以使用以下命令获取

kubeadm token create --print-join-command

安装 Pod Network (在 master 节点 flannel/Calico 网络插件)

在 master 节点查看集群情况,可以看到节点的 status 还是 NotReady,这是由于还没有网络插件。

flannel插件 为例,在 master 节点 执行

#For Kubernetes v1.7+
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

Calico插件- 参考 https://docs.projectcalico.org/getting-started/kubernetes/quickstart

等待所有的 pod 都是 running 状态,可以看到所有 node 的 status 是 running 的状态,这时 kubernetes 集群就搭建好了。

至此3个节点的集群搭建完成,后续可以继续添加node节点,或者部署dashboard、helm包管理工具、EFK日志系统、Prometheus Operator监控系统、rook+ceph存储系统等组件

部署一个简单示例

kubectl create -f nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80

发布服务,暴露端口

kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer

【Kubernetes学习笔记】-kubeadm 手动搭建kubernetes 集群的更多相关文章

  1. 手动搭建 redis 集群

    转自http://meia.fun/article/1544161420745 手动搭建 redis 集群 redis 基本命令: 启动 redis 服务:redis-server xxx.conf ...

  2. kubernetes系列03—kubeadm安装部署K8S集群

    本文收录在容器技术学习系列文章总目录 1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 1.3 安装kubernetes方法 1.3.1 方法1:使用kubeadm ...

  3. kubernetes学习笔记之十一:kubernetes dashboard认证及分级授权

    第一章.部署dashboard 作为Kubernetes的Web用户界面,用户可以通过Dashboard在Kubernetes集群中部署容器化的应用,对应用进行问题处理和管理,并对集群本身进行管理.通 ...

  4. java 学习笔记(三)ZooKeeper集群搭建实例,以及集成dubbo时的配置 (转)

    ZooKeeper集群搭建实例,以及集成dubbo时的配置 zookeeper是什么: Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式 ...

  5. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  6. kubeadm快速搭建k8s集群

    环境 master01:192.168.1.110 (最少2核CPU) node01:192.168.1.100 规划 services网络:10.96.0.0/12 pod网络:10.244.0.0 ...

  7. OceanBase数据库实践入门——手动搭建OceanBase集群

    前言 目前有关OceanBase功能.案例.故事的文章已经很多,对OceanBase感兴趣的朋友都想安装一个数据库试试.本文就是分享初学者如何手动搭建一个OceanBase集群.这也是学习理解Ocea ...

  8. Redis 超详细的手动搭建Cluster集群步骤

    功能概述 ​ Redis Cluster是Redis的自带的官方分布式解决方案,提供数据分片.高可用功能,在3.0版本正式推出. ​ 使用Redis Cluster能达到负载均衡的问题,内部采用哈希分 ...

  9. [补充资料] 手动搭建 Cloudera 集群

    本课主题 集群搭建 设置 Web 服务器 启动 ClouderManager 登入 Cloudera Manager 引言 这部份是一个补充资料,记录如何安装 Cloudera 服务器 集群搭建 查看 ...

随机推荐

  1. JavaScript一元运算符、二元运算符和三元运算符

    在JavaScript中,运算符可以根据其实际操作数的个数进行分类. JavaScript中的大多数运算符是一个二元运算符(binary operator),将两个表达式合并成为一个稍复杂的表达式.譬 ...

  2. new与malloc的10点区别(转)

    1. 申请的内存所在位置 new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存.自由存储区是C++基于new操作符的一个抽象概念,凡是通过ne ...

  3. Git 分支相关

    创建分支 git branch dev 切换分支 git checkout dev (dev换成-可切换为上一个使用的分支) 以上两个可合并为 git checkout -b dev 将新分支推送到远 ...

  4. CSS3之flex布局

    若要使用flex布局,需在父元素上声明" display : flex ",这样它所有的直系子元素就成为flex元素 1.居中 1)垂直居中:align-items : cente ...

  5. Spring Cloud Security OAuth2.0 认证授权系列(一) 基础概念

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 前序 最近想搞下基于Spring Cloud的认证授权平台,总体想法是可以对服务间授权,想做一个基于Agent 的无 ...

  6. 深度分析:mybatis的底层实现原理,看完你学会了吗?

    前言 最近在和粉丝聊天的时候被粉丝问到jdbc和mybatis底层实现这一块的问题,而且还不止一个小伙伴问到,于是我似乎认识到了问题的严重性,我花了两天时间整理了一下自己的认识和网上查阅的资料写了这篇 ...

  7. 如何用Prometheus监控十万container的Kubernetes集群

    概述 不久前,我们在文章<如何扩展单个Prometheus实现近万Kubernetes集群监控?>中详细介绍了TKE团队大规模Kubernetes联邦监控系统Kvass的演进过程,其中介绍 ...

  8. 2021版的思维导图MindManager 安装激活以及换机教程

    思维导图软件MindManager更新版本啦,相信细心的小伙伴应该已经发现了,MindManager最新版的名称变成了MindManager Windows 21,并且更新了很多新功能,点击查看Min ...

  9. 思维导图MindManager流程图有哪些功能

    流程图是思维导图中的一种图表,应用相当广泛.MindManager 2020作为专业的思维导图软件,更加强了流程图的功能,让用户能使用更加简便的MindManager技巧绘制流程图.接下来,就让我们一 ...

  10. mongodb 副本集之入门篇

    作者: 凹凸曼-军军 前言:mongodb 因为高性能.高可用性.支持分片等特性,作为非关系型数据库被大家广泛使用.其高可用性主要是体现在 mongodb 的副本集上面(可以简单理解为一主多从的集群) ...