本文将带领读者一起, 参照着 Kubernetes 官方文档,对其安装部署进行讲解。Kubernetes更新迭代很快,书上、网上等教程可能并不能适用于新版本,但官方文可以。

Kubernetes 教程之跟着官方文档从零搭建 K8S

文章地址: https://blog.piaoruiqing.com/blog/2019/09/17/搭建 k8s/

前言

本文将带领读者一起, 参照着 Kubernetes 官方文档, 对其安装部署进行讲解. Kubernetes 更新迭代很快, 书上、网上等教程可能并不能适用于新版本, 但官方文档能.

阅读这篇文章你能收获到:

  • 如何阅读 Kubernetes 官方安装指南并搭建一个 Kubernetes 环境.
  • Kubernetes 安装过程中的注意事项.
  • 避过常见的坑.

阅读本文你需要:

  • 熟悉 Linux 命令.
  • 知道 Kubernetes 是用来干什么的 (不然装它干啥(ಥ_ಥ)).
  • 知道 Docker

器材准备

文档链接: Before you begin

序号 名称 数量 备注
1 服务器 2 操作系统: Linux(centos7, 其它操作系统也可, 安装过程类似, 可参考官方文档)
机器配置: CPU >= 2, 内存 >= 2G

从官网找到kubeadm安装文档入口, 文档很详细. 英文阅读没有障碍的读者推荐直接查看英文文档, 中文文档不全且更新不及时安装时可能存在问题.

前期准备

笔者已经预先安装好了两台虚拟机, centos7(CPUx2, 内存 2.5G). 并在路由器上固定了这两个虚拟机的 IP 地址.

修改 hostname

[root@k8s-master ~]$ vim /etc/hostname # 修改 hostname[root@k8s-master ~]$ vim /etc/hosts    # 将本机 IP 指向 hostname[root@k8s-master ~]$ reboot -h         # 重启(可以做完全部前期准备后再重启)

修改后, 两台虚拟机的配置如下:

# in k8s-master[root@k8s-master ~]$ cat /etc/hostname k8s-master[root@k8s-master ~]$ cat /etc/hosts | grep k8s10.33.30.92 k8s-master10.33.30.91 k8s-worker# in k8s-worker[root@k8s-worker ~]$ cat /etc/hostname k8s-worker[root@k8s-worker ~]$ cat /etc/hosts | grep k8s10.33.30.92 k8s-master10.33.30.91 k8s-worker

确认 MAC 和 product_uuid 的唯一性

文档链接: Verify the MAC address and product_uuid are unique for every node

[root@k8s-master ~]$ ifconfig -a    # 查看 MAC[root@k8s-master ~]$ cat /sys/class/dmi/id/product_uuid    # 查看 product_uuid

注: 如果你的 centos7 没有ifconfig命令, 可以执行yum install net-tools进行安装.

配置防火墙

文档链接: Check required ports

由于是本地内网测试环境, 笔者图方便, 直接关闭了防火墙. 若安全要求较高, 可以参考官方文档放行必要端口.

[root@k8s-master ~]$ systemctl stop firewalld    # 关闭服务[root@k8s-master ~]$ systemctl disable firewalld    # 禁用服务

禁用 SELinux

文档链接: coredns pods have CrashLoopBackOff or Error state

修改/etc/selinux/config, 设置SELINUX=disabled. 重启机器.

[root@k8s-master ~]$ sestatus    # 查看 SELinux 状态SELinux status: disabled

禁用交换分区

文档链接: Before you begin

Swap disabled. You MUST disable swap in order for the kubelet to work properly.

编辑/etc/fstab, 将 swap 注释掉. 重启机器.

[root@k8s-master ~]$ vim /etc/fstab #/dev/mapper/cl-swap     swap                    swap    defaults        0 0

安装 Docker

文档链接: Get Docker Engine - Community for CentOS

Docker 官方文档对安装步骤描述已经足够详细, 过程并不复杂, 本文便不再赘述.

  • Docker 请使用18.09, k8s 暂不支持 Docker 最新版19.x, 安装时请按照文档描述的方式明确指定版本号yum install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io.

  • 若网络不好, 可换用国内源, 阿里云、中科大等都可. 此处附上阿里云源 docker 安装文档地址: 容器镜像服务.

  • 安装完毕后, 建议将 docker 源替换为国内. 推荐阿里云镜像加速, 有阿里云账号即可免费使用.阿里云 -> 容器镜像服务 -> 镜像中心 -> 镜像加速

配置 Docker

文档地址: Container runtimes

修改/etc/docker/daemon.json为如下内容:

{  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],  "exec-opts": ["native.cgroupdriver=systemd"],  "log-driver": "json-file",  "log-opts": {    "max-size": "100m"  },  "storage-driver": "overlay2"}
  • 其中https://xxxxxxxx.mirror.aliyuncs.com为阿里云镜像加速地址, xxxxxxxx需要替换为自己账户中的地址. 如图:

安装配置完毕后执行:

[root@k8s-master ~]$ systemctl enable docker[root@k8s-master ~]$ systemctl start docker

安装 Kubernetes

文档地址: Installing kubeadm, kubelet and kubectl

添加源

由于国内网络原因, 官方文档中的地址不可用, 本文替换为阿里云镜像地址, 执行以下代码即可:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgexclude=kube*EOF

安装

[root@k8s-master ~]$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes[root@k8s-master ~]$ systemctl enable kubelet && systemctl start kubelet

修改网络配置

cat <<EOF >  /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsysctl --system

注意: 至此, 以上的全部操作, 在 Worker 机器上也需要执行. 注意 hostname 等不要相同.

初始化 Master

生成初始化文件

[root@k8s-master ~]$ kubeadm config print init-defaults > kubeadm-init.yaml

该文件有两处需要修改:

  • advertiseAddress: 1.2.3.4修改为本机地址
  • imageRepository: k8s.gcr.io修改为imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers

修改完毕后文件如下:

apiVersion: kubeadm.k8s.io/v1beta2bootstrapTokens:- groups:  - system:bootstrappers:kubeadm:default-node-token  token: abcdef.0123456789abcdef  ttl: 24h0m0s  usages:  - signing  - authenticationkind: InitConfigurationlocalAPIEndpoint:  advertiseAddress: 10.33.30.92  bindPort: 6443nodeRegistration:  criSocket: /var/run/dockershim.sock  name: k8s-master  taints:  - effect: NoSchedule    key: node-role.kubernetes.io/master---apiServer:  timeoutForControlPlane: 4m0sapiVersion: kubeadm.k8s.io/v1beta2certificatesDir: /etc/kubernetes/pkiclusterName: kubernetescontrollerManager: {}dns:  type: CoreDNSetcd:  local:    dataDir: /var/lib/etcdimageRepository: registry.cn-hangzhou.aliyuncs.com/google_containerskind: ClusterConfigurationkubernetesVersion: v1.15.0networking:  dnsDomain: cluster.local  serviceSubnet: 10.96.0.0/12scheduler: {}

下载镜像

[root@k8s-master ~]$ kubeadm config images pull --config kubeadm-init.yaml
[版权声明]
本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:http://blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.

执行初始化

[root@k8s-master ~]$ kubeadm init --config kubeadm-init.yaml

等待执行完毕后, 会输出如下内容:

...Your Kubernetes control-plane has initialized successfully!...Then you can join any number of worker nodes by running the following on each as root:kubeadm join 10.33.30.92:6443 --token abcdef.0123456789abcdef \    --discovery-token-ca-cert-hash sha256:2883b1961db36593fb67ab5cd024f451b934fc0e72e2fa3858dda3ad3b225837 

最后两行需要保存下来, kubeadm join ...是 worker 节点加入所需要执行的命令.

接下来配置环境, 让当前用户可以执行 kubectl 命令:

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

测试一下: 此处的NotReady是因为网络还没配置.

[root@k8s-master kubernetes]$ kubectl get nodeNAME         STATUS     ROLES    AGE     VERSIONk8s-master   NotReady   master   3m25s   v1.15.3

配置网络

文档地址: Instructions

下载描述文件

[root@k8s-master ~]$ wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml[root@k8s-master ~]$ cat kubeadm-init.yaml | grep serviceSubnet:serviceSubnet: 10.96.0.0/12

打开calico.yaml, 将192.168.0.0/16修改为10.96.0.0/12

需要注意的是, calico.yaml 中的 IP 和 kubeadm-init.yaml 需要保持一致, 要么初始化前修改 kubeadm-init.yaml, 要么初始化后修改 calico.yaml.

执行kubectl apply -f calico.yaml初始化网络.

此时查看 node 信息, master 的状态已经是Ready了.

[root@k8s-master ~]$ kubectl get nodeNAME         STATUS   ROLES    AGE   VERSIONk8s-master   Ready    master   15m   v1.15.3

安装 Dashboard

文档地址: Web UI (Dashboard)

部署 Dashboard

文档地址: Deploying the Dashboard UI

[root@k8s-master ~]$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml[root@k8s-master ~]$ kubectl apply -f recommended.yaml 

部署完毕后, 执行kubectl get pods --all-namespaces查看 pods 状态

[root@k8s-master kubernetes]$ kubectl get pods --all-namespaces | grep dashboardNAMESPACE              NAME                                        READY   STATUS   kubernetes-dashboard   dashboard-metrics-scraper-fb986f88d-m9d8z   1/1     Runningkubernetes-dashboard   kubernetes-dashboard-6bb65fcc49-7s85s       1/1     Running 

创建用户

文档地址: Creating sample user

创建一个用于登录 Dashboard 的用户. 创建文件dashboard-adminuser.yaml内容如下:

apiVersion: v1kind: ServiceAccountmetadata:  name: admin-user  namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: admin-userroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- kind: ServiceAccount  name: admin-user  namespace: kube-system

执行命令kubectl apply -f dashboard-adminuser.yaml.

生成证书

文档地址: Accessing Dashboard 1.7.X and above

官方文档中提供了登录 1.7.X 以上版本的登录方式, 但并不清晰, 笔者没有完全按照该文档的方式进行操作.

[root@k8s-master ~]$ grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt[root@k8s-master ~]$ grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key[root@k8s-master ~]$ openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

第三条命令生成证书时会提示输入密码, 可以直接两次回车跳过.

kubecfg.p12即需要导入客户端机器的证书. 将证书拷贝到客户端机器上, 导入即可.

~$ scp root@10.33.30.92:/root/.kube/kubecfg.p12 ./
  • 需要注意的是: 若生成证书时跳过了密码, 导入时提示填写密码直接回车即可, 不要纠结密码哪来的 (゚▽゚)/

此时我们可以登录面板了, 访问地址: https://{k8s-master-ip}:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login, 登录时会提示选择证书, 确认后会提示输入当前用户名密码(注意是电脑的用户名密码).

登录 Dashboard

文档地址:Bearer Token

执行kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}'), 获取 Token.

[root@k8s-master .kube]$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')Name:         admin-user-token-dhhkbNamespace:    kube-systemLabels:       <none>Annotations:  kubernetes.io/service-account.name: admin-user              kubernetes.io/service-account.uid: b20d1143-ce94-4379-9e14-8f80f06d8479Type:  kubernetes.io/service-account-tokenData====ca.crt:     1025 bytesnamespace:  11 bytestoken:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWRoaGtiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMjBkMTE0My1jZTk0LTQzNzktOWUxNC04ZjgwZjA2ZDg0NzkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.f6IbPGwIdFZWStzBj8_vmF01oWW5ccaCpPuVQNLSK1pgEqn0kNVK_x0RYSuKEnujObzpQQdFiRYcI6ITHja2PIVc5Nv83VCn5IaLvZdYuGZWUYRw0efJUBMA4J4N8-pRkiw6fYAuWLeGYghLNXL_nDdC_JkG75ASqrr3U1MVaikOcfrEPaI-T_AJ3TMYhI8aFoKiERpumu5W1K6Jl80Am9pWDX0Ywis5SSUP1VYfu-coI48EXSptcaxEyv58PrHUd6t_oMVV9rpqSxrNtMZvMeXqe8Hnl21vR7ls5yTZegYtHXSc3PKvCaIalKhYXAuhogNcIXHaMzvLSbf-DSQkVw

复制该 Token 到登录页, 点击登录即可, 效果如下:

添加 Worker 节点

重复执行 前期准备-修改 hostname ~ 安装 Kubernetes-修改网络配置的全部操作, 初始化一个 Worker 机器.

执行如下命令将 Worker 加入集群:

kubeadm join 10.33.30.92:6443 --token abcdef.0123456789abcdef \    --discovery-token-ca-cert-hash sha256:2883b1961db36593fb67ab5cd024f451b934fc0e72e2fa3858dda3ad3b225837 
  • 注意: 此处的秘钥是初始化 Master 后生成的, 参考前文.

添加完毕后, 在 Master 上查看节点状态:

[root@k8s-master ~]$ kubectl get nodeNAME         STATUS   ROLES    AGE   VERSIONk8s-master   Ready    master   10h   v1.15.3k8s-worker   Ready    <none>   96s   v1.15.3

在面板上也可查看:

参考文献

  • https://kubernetes.io
  • https://github.com/kubernetes/dashboard

推荐阅读:

  • 开放 API 网关实践(一) ——设计一个 API 网关
  • 开放 API 网关实践(二) —— 重放攻击及防御
  • 开放 API 网关实践(三) —— 限流
  • Kubernetes(一) 跟着官方文档从零搭建 K8S
  • Kubernetes(二) 应用部署
  • Kubernetes(三) 如何从外部访问服务

欢迎关注公众号(代码如诗)

[版权声明]
本文发布于朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者朴瑞卿 及链接:http://blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.

本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。

阅读全文: http://gitbook.cn/gitchat/activity/5db6e478bc42e61c77e03d1c

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App , GitChat 专享技术内容哦。

Kubernetes教程之跟着官方文档从零搭建K8S相关推荐

  1. k8s多master建议用几个_Kubernetes 教程之跟着官方文档从零搭建 K8S

    前言 本文将带领读者一起, 参照者 Kubernetes 官方文档, 对其安装部署进行讲解. Kubernetes 更新迭代很快, 书上.网上等教程可能并不能适用于新版本, 但官方文档能. 阅读这篇文 ...

  2. 跟着官方文档一步一步搭建基于gozero的微服务

    1. 创建项目 mkdir microservice cd microservice go mod init zzh.com/microservice 2. 下载go-zero和goctl 2.1 设 ...

  3. 跟着官方文档学DGL框架第一天——DGL概览

    主要参考:https://docs.dgl.ai/tutorials/basics/1_first.html DGL是什么 DGL是一种用于简化图神经网络实现的包,感觉官方文档写得很亲民,打算好好拜读 ...

  4. Harbor安装教程-完全根据官方文档2.6.0版本

    说明: 版本2.6.0 一.安装要求 硬件 硬件类型 最小要求 建议 CPU 2 CPU 4 CPU 内存 4 GB 8GB 硬盘 40 GB 160 GB 软件 软件名称 版本 Docker eng ...

  5. 【keras】keras教程(参考官方文档)

    文章目录 一.callbacks篇 1.ReduceLROnPlateau 训练过程优化学习率 2.EarlyStopping 早停操作 3.ModelCheckpoint 用于设置保存的方式 4.T ...

  6. python3.7基础教程_关于本教程 |《Python 官方文档:入门教程 3.7.0》| Python 技术论坛...

    本文档最新版为 3.8,旧版本可能放弃维护,推荐阅读最新版! Python 入门教程 Python 是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并能够用简单又有效的方式进行面向对象编 ...

  7. 跟着官方文档能学懂React Hooks就怪了

    大家好,我是若川.今天分享一篇关于「React Hooks」的好文.欢迎点击下方卡片关注我. 以下是正文~ 回想下你入门Hooks的过程,是不是经历过: 类比ClassComponent的生命周期,学 ...

  8. faiss教程【facebook官方文档】

    官方教程 开始 对于以下内容,我们假设已安装Faiss. 我们在C ++和Python中提供代码示例. 可以通过复制/粘贴代码或从Faiss发行版的tutorial /子目录运行代码来运行代码. 生成 ...

  9. 跟着官方文档学DGL框架第七天——下载和处理数据集

    参考链接 https://docs.dgl.ai/guide/data.html#guide-data-pipeline https://docs.dgl.ai/en/0.5.x/_modules/d ...

最新文章

  1. loj #6235. 区间素数个数
  2. 对Spring事务一些问题的讨论
  3. mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...
  4. C++实现二叉树的相应操作
  5. 性能测试:基础(4)
  6. java大数据开发工程师,面试题附答案
  7. c语言二维数组错误语法,关于c语言动态分配二维数组free的错误求dalao看看怎么回事谢谢啊~~~~...
  8. DOM-window下的常用子对象-location-刷新页面
  9. mvc:annotation-driven /
  10. Android APP开发入门教程-Button
  11. 一分钟教会你固态硬盘数据恢复方法
  12. [人工智能-深度学习-35]:卷积神经网络CNN - 常见分类网络- GoogLeNet Incepetion网络架构分析与详解
  13. macOS 10.14配置APUE环境
  14. VM虚拟机下添加一个硬盘
  15. DSP大数据精准广告的介绍
  16. vue PC端菜单优化(第一个菜单隐藏的时候,整个菜单都不显示)
  17. 像冯满天老师一样热爱一样东西
  18. java 调用企查查API查询企业信息
  19. cmd中连接雷电模拟器时报错adb device not found
  20. python 代码合并txt文件

热门文章

  1. 12月19日科技资讯|富士康员工涉嫌盗卖 iPhone 零件遭调查;IntelliJ IDEA 2019.3.1 发布
  2. 题目描述: 某城市有一个火车站,铁轨铺设如图所示。 有n节车厢从A方向驶入车站,按进站顺序编号1~n。 现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。 为了重组车厢,可以借助中转站C。
  3. 解决M1处理器款mac安装DW闪退问题 Dreamweaver 2021 Mac(已适配M1芯片,支持最新款M1芯片Mac)
  4. Android 接入穿山甲SDK之插屏广告
  5. Ubuntu下安装gem包curses的步骤
  6. 利用Canvas在浏览器上绘制复杂图形,比如:绘制一件衣服,绘制一条围巾,现阶段研究成果
  7. 免费翻译英文文献自动生成PDF双语文档小技巧
  8. Centos7 GNOME Desktop桌面版-调整屏幕分辨率
  9. 数据库之关系模型介绍
  10. 【附源码】Python计算机毕业设计企业合同管理系统