kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。

这个工具能通过两条指令完成一个kubernetes集群的部署:

# 创建一个 Master 节点
$ kubeadm init

# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master节点的IP和端口 >

3.1 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64

  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多

  • 集群中所有机器之间网络互通

  • 可以访问外网,需要拉取镜像

  • 禁止swap分区

3.2 准备环境

角色 IP cpu/内存/硬盘
k8s-master 172.16.1.70 2核/4G/60g
k8s-node1 172.16.1.71 4核/8G/60g
k8s-node2 172.16.1.72 4核/8G/60g
关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld

关闭selinux:
$ sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
$ setenforce 0 # 临时

关闭swap:
$ swapoff -a # 临时
$ vim /etc/fstab # 永久

设置主机名:
$ hostnamectl set-hostname <hostname>

在master添加hosts:
$ cat >> /etc/hosts << EOF
172.16.1.70 k8s-master
172.16.1.71 k8s-node1
172.16.1.72 k8s-node2
EOF

将桥接的IPv4流量传递到iptables的链:
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sysctl --system # 生效

时间同步:
$ yum install ntpdate -y
$ ntpdate time.windows.com

3.4 所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

1、 安装Docker

$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-3.el7
$ systemctl enable docker && systemctl start docker
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
# cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# systemctl daemon-reload
# systemctl restart docker.service

2、 添加阿里云YUM软件源

$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

3、 安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

$ yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
$ systemctl start kubelet
$ systemctl enable kubelet

3.5 部署Kubernetes Master

在 172.16.1.70(Master)执行。

$ kubeadm init \
--apiserver-advertise-address=172.16.1.70 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

使用kubectl工具:

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

3.6 安装Pod网络插件(CNI)

在 172.16.1.70(Master)执行。

$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
$ kubectl apply -f kube-flannel.yml

确保能够访问到quay.io这个registery。

如果Pod镜像下载失败,可以改成这个镜像地址:lizhenliang/flannel:v0.11.0-amd64

方法:修改 kube-flannel.yml 文件,搜索amd64,将2个 image: quay.io/coreos/flannel:v0.12.0-amd64 修改为

image: lizhenliang/flannel:v0.11.0-amd64 ,然后应用文件 kubectl apply -f kube-flannel.yml

3.7 加入Kubernetes Node

1 在 172.16.1.71/72(Node)执行

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

$ kubeadm join 172.16.1.70:6443 --token n9lizc.pjgxy388qhp1ccvq \
   --discovery-token-ca-cert-hash sha256:7d4d2a33d3035f7eb82b35d40282b87ec69aa7997ba08bcbfad5a1a7a26c8be3

2 在 172.16.1.70(Master)执行查看 node 状态

# kubectl get nodes
NAME         STATUS   ROLES   AGE   VERSION
k8s-master   Ready   master   106m   v1.17.0
k8s-node1   Ready   <none>   93m   v1.17.0
k8s-node2   Ready   <none>   93m   v1.17.0

3 默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下

在 172.16.1.70(Master)执行。

# kubeadm token create
60eb4m.0ibsk2y7f5e9idsu
# kubeadm token list
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
7d4d2a33d3035f7eb82b35d40282b87ec69aa7997ba08bcbfad5a1a7a26c8be3

在 172.16.1.71/72(Node)执行。

# kubeadm join 172.16.1.70:6443 --token 60eb4m.0ibsk2y7f5e9idsu --discovery-token-ca-cert-hash sha256:7d4d2a33d3035f7eb82b35d40282b87ec69aa7997ba08bcbfad5a1a7a26c8be3

或直接在master节点上执行下面的命令,生成node节点加入命令。

kubeadm token create --print-join-command

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

3.8 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

在 172.16.1.70(Master)执行。

$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pods,svc
NAME                         READY   STATUS   RESTARTS   AGE
pod/nginx-86c57db685-cfhps   1/1     Running   0         13m

NAME                 TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE
service/kubernetes   ClusterIP   10.96.0.1   <none>       443/TCP       73m
service/nginx       NodePort   10.96.2.88   <none>       80:32360/TCP   10m

访问地址:http://NodeIP:Port

例如:http://172.16.1.70/71/72:32360

# kubectl get pods,svc --show-labels -l app=nginx
NAME                         READY   STATUS   RESTARTS   AGE   LABELS
pod/nginx-86c57db685-cfhps   1/1     Running   0         19m   app=nginx,pod-template-hash=86c57db685

NAME           TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE   LABELS
service/nginx   NodePort   10.96.2.88   <none>       80:32360/TCP   16m   app=nginx

3.9 部署 Dashboard

在 172.16.1.70(Master)执行。

$ wget -O dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:

修改前

kind: Service
apiVersion: v1
metadata:
labels:
   k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
   - port: 443
     targetPort: 8443
selector:
   k8s-app: kubernetes-dashboard

修改后

kind: Service
apiVersion: v1
metadata:
labels:
   k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
   - port: 443
     targetPort: 8443
     nodePort: 30001
selector:
   k8s-app: kubernetes-dashboard

应用配置文件

$ kubectl apply -f dashboard.yaml
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
......

访问地址:https://NodeIP:30001

创建service account并绑定默认cluster-admin管理员集群角色:

$ kubectl create serviceaccount dashboard-admin -n kube-system
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

使用输出的token登录Dashboard。

解决Dashboard其他浏览器不能访问的问题

1 二进制 部署
# 注意你部署Dashboard的命名空间(之前部署默认是kube-system,新版是kubernetes-dashboard)
(1) 删除默认的secret,用自签证书创建新的secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
kubectl create secret generic kubernetes-dashboard-certs \
--from-file=/opt/kubernetes/ssl/server-key.pem --from-file=/opt/kubernetes/ssl/server.pem -n kubernetes-dashboard

(2) 修改 dashboard.yaml 文件,在args下面增加证书两行
args:
# PLATFORM-SPECIFIC ARGS HERE
- --auto-generate-certificates
- --tls-key-file=server-key.pem
- --tls-cert-file=server.pem

kubectl apply -f kubernetes-dashboard.yaml

2 kubeadm 部署
# 注意你部署Dashboard的命名空间(之前部署默认是kube-system,新版是kubernetes-dashboard)
(1) 删除默认的secret,用自签证书创建新的secret
kubectl delete secret kubernetes-dashboard-certs -n kubernetes-dashboard
kubectl create secret generic kubernetes-dashboard-certs \
--from-file=/etc/kubernetes/pki/apiserver.key --from-file=/etc/kubernetes/pki/apiserver.crt -n kubernetes-dashboard

(2) 修改 dashboard.yaml 文件,在args下面增加证书两行
args:
# PLATFORM-SPECIFIC ARGS HERE
- --auto-generate-certificates
- --tls-key-file=apiserver.key
- --tls-cert-file=apiserver.crt

(3) 应用
kubectl apply -f dashboard.yaml

(4) 升级
[root@k8s-master tools]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS             RESTARTS   AGE
dashboard-metrics-scraper-76585494d8-29b4x   1/1     Running             0         43m
kubernetes-dashboard-5485599ff9-dm6pq       0/1     ContainerCreating   0         46s
kubernetes-dashboard-5996555fd8-g4lrt       1/1     Running             0         43m

(5) 升级完成
[root@k8s-master tools]# kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS   RESTARTS   AGE
dashboard-metrics-scraper-76585494d8-29b4x   1/1     Running   0         43m
kubernetes-dashboard-5485599ff9-dm6pq       1/1     Running   0         68s

第3章:快速部署一个Kubernetes集群的更多相关文章

  1. 快速部署一个Kubernetes集群

    官方提供的三种部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,仅用于尝试Kubernetes或日常开发的用户使用. 部署地址:https:// ...

  2. kubeadm部署一个Kubernetes集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm in ...

  3. Harbor快速部署到Kubernetes集群及登录问题解决

    Harbor(https://goharbor.io)是一个功能强大的容器镜像管理和服务系统,用于提供专有容器镜像服务.随着云原生架构的广泛使用,原来由VMWare开发的Harbor也加入了云原生基金 ...

  4. Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群

    前言 前面用到过的 minikube 只是一个单节点的 k8s 集群,这对于学习而言是不够的.我们需要有一个多节点集群,才能用到各种调度/监控功能.而且单节点只能是一个加引号的"集群&quo ...

  5. 使用 Kubeadm+Containerd 部署一个 Kubernetes 集群

    本文独立博客阅读地址:https://ryan4yin.space/posts/kubernetes-deployemnt-using-kubeadm/ 本文由个人笔记 ryan4yin/knowle ...

  6. 使用docker快速部署一个consul集群

    作为一个开发者,有时候需要一个集群环境,之前的做法要么就是使用多个虚拟机,要么就是采用不同的端口来模拟,但是虚拟机比较占内存,而且启动慢,采用不同的端口来模拟,管理起来比较麻烦一些,程序隔离性差一些. ...

  7. 用kubeadm+dashboard部署一个k8s集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 1. 安装要求 在开始之前,部署Kubernetes集群 ...

  8. 使用Minikube部署本地Kubernetes集群(二十八)

    前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...

  9. 用Docker swarm快速部署Nebula Graph集群

    用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...

随机推荐

  1. 阿里云上安装 OpenStack 是什么体验

    阿里云上跑火车(安装 OpenStack Train 版本),猜猜最终花了多少钱? 前言 前面给大家提供了用虚拟机安装 OpenStack 的镜像,虽然已经很简便了,但还是略显笨重.一来镜像文件比较大 ...

  2. MySQL配置HeartBeat实现心跳监控和浮动IP

    1. 初始化环境配置 /sbin/chkconfig --add mysqld /sbin/chkconfig mysqld on ln -s /usr/local/mysql/bin/mysql / ...

  3. HTML的一些标签以及表单

    HTML的一些标签以及表单 图片标签 属性 说明 src 图像的路径 alt 图像不能显示时的替换文字 title 鼠标悬停时显示的内容 border 设置图像边框的宽度 align 对齐方式 相对路 ...

  4. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  5. eclispe--tomcat配置

    eclipse安装tomcat方法: 1.下载tomcat,从官网下载,地址:http://tomcat.apache.org/download-70.cgi 2.将下载下来的压缩包解压,放在自己想放 ...

  6. ubuntu16.04服务自启动(弹控制台)

    一.设置root桌面用户登录 1.vim  /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 在最后一行添加greeter-show-manual-lo ...

  7. GO学习-(35) Go实现日志收集系统4

    Go实现日志收集系统4   到这一步,我的收集系统就已经完成很大一部分工作,我们重新看一下我们之前画的图: 我们已经完成前面的部分,剩下是要完成后半部分,将kafka中的数据扔到ElasticSear ...

  8. Elasticsearch常用DSL关键字

    Elasticsearch常用DSL关键字 query: 用于包含查询使用到的语法 match_all: 最简单的查询,获取索引所有数据,类似搜索 *.如:"query":{&qu ...

  9. Docker学习(6) 获取和推送镜像

    查找镜像 拉取镜像 推送镜像 总结

  10. Velodyne VLP-16激光雷达数据分析

    Velodyne VLP-16激光雷达数据分析 Velodyne VLP-16激光雷达保持了 Velodyne 在 LiDAR 中的突破性重要功能:实时收发数据.360 度全覆盖.3D 距离测量以及校 ...