从零开始搭建一个K8S的环境
市面上有很多的K8S的书籍,但是关于如何搭建K8S的文章不多;下面笔者结合自己的经验,分享一下如何在阿里云的CentOs服务器上,搭建一个K8S的集群。
前提条件
一个阿里云的账号或者自己准备两台VM,其中一台是K8S的Master服务器,另外一台是K8S的Worker节点。
笔者自己在阿里云上面新建了2台按需付费的实例。
Master服务器:k8sMaster 172.24.137.71
Worker服务器:k8sWorker 172.24.137.72
因为Master节点和Worker节点要进行相互的网络访问,根据K8S对网络防火墙的要求,需要开通下面的端口
创建两个安全组:
Master节点加入下面的安全组
Woker节点加入下面的安全组
具体细节,请参考K8S防火墙
Master节点应该开的网络防火墙设置:
Worker节点应该开的网络防火墙设置:
1. 安装Docker
首先在Master服务器和Worker服务器上都要安装好Docker,为了加快安装的过程,需要把Docker安装文件的镜像指向国内的
阿里云镜像。如果直接用国外的,可能要1个多小时甚至更长时间下载安装包,但是如果直接指向http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep,快的话,分分钟的时间就下载并安装完成。
1.1 更改源为阿里源
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-enginesudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep
1.2 安装Docker
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep
yum list docker-ce --showduplicates | sort -r
sudo yum makecache fast
yum install docker-ce-18.06.3.ce-3.el7 docker-ce-cli-18.06.3.ce-3.el7 containerd.io
安装完后执行
systemctl enable docker
systemctl start docker
1.3 修改Docker的源为阿里自己的Docker Hub <可选>
安装完毕后, 建议将 docker 源替换为国内. 推荐阿里云镜像加速, 有阿里云账号即可免费使用.阿里云 -> 容器镜像服务 -> 镜像中心 -> 镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
其中,xxxxx自己阿里云账号的Docker Hub Register中心
安装完后执行
sudo systemctl daemon-reload
sudo systemctl restart docker
2. 安装K8S
在Master和Worker的机器上都是一样的安装步骤
2.1 修改K8S的源为阿里的源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
2.2 安装K8S的软件
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
2.3 K8S的通用网络配置
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
3. 配置Master节点和安装Dashboard
3.1 初始化Master节点
kubeadm config print init-defaults > kubeadm-init.yaml
修改模板文件的中2处配置:
将advertiseAddress: 1.2.3.4修改为本机地址
将imageRepository: k8s.gcr.io修改为imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
[root@k8sMaster ~]# cat kubeadm-init.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 172.24.137.71bindPort: 6443
nodeRegistration:criSocket: /var/run/dockershim.sockname: k8smastertaints:- effect: NoSchedulekey: 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: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.0
networking:dnsDomain: cluster.localserviceSubnet: 10.96.0.0/12
scheduler: {}
3.2 下载K8S Master节点的依赖的管理Docker镜像
kubeadm config images pull --config kubeadm-init.yaml
3.3 执行初始化
kubeadm init --config kubeadm-init.yaml
最后两行需要保存下来, kubeadm join …是 worker 节点加入所需要执行的命令.
其参考格式如下:
kubeadm join 172.24.137.71:6443 --token 6s1u3g.rns2x03czqjux1x1 \--discovery-token-ca-cert-hash sha256:da3ffd7e60b1ad55f2a95ea6375f15deb21d09299eb0b803b9f7fb8a4ad0a356
3.4 配置kubectl命令
为了能够使用kubectl, 需要依赖/etc/kubernetes/admin.conf 文件,配置方法
在当前的登陆用户名下,新建一个.kube的目录,kubectl默认会读取这个文件夹下的配置,然后执行下面的复制命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
此时,就能执行kubectl的相关命令
[root@k8sMaster ~]# kubectl
kubectl controls the Kubernetes cluster manager.Find more information at:
https://kubernetes.io/docs/reference/kubectl/overview/Basic Commands (Beginner):create Create a resource from a file or from stdin.expose Take a replication controller, service, deployment or pod and
expose it as a new Kubernetes Servicerun Run a particular image on the clusterset Set specific features on objectsBasic Commands (Intermediate):explain Documentation of resourcesget Display one or many resourcesedit Edit a resource on the serverdelete Delete resources by filenames, stdin, resources and names, or by
resources and label selectorDeploy Commands:rollout Manage the rollout of a resourcescale Set a new size for a Deployment, ReplicaSet or Replication
Controllerautoscale Auto-scale a Deployment, ReplicaSet, or ReplicationControllerCluster Management Commands:certificate Modify certificate resources.cluster-info Display cluster infotop Display Resource (CPU/Memory/Storage) usage.cordon Mark node as unschedulableuncordon Mark node as schedulabledrain Drain node in preparation for maintenancetaint Update the taints on one or more nodesTroubleshooting and Debugging Commands:describe Show details of a specific resource or group of resourceslogs Print the logs for a container in a podattach Attach to a running containerexec Execute a command in a containerport-forward Forward one or more local ports to a podproxy Run a proxy to the Kubernetes API servercp Copy files and directories to and from containers.auth Inspect authorizationdebug Create debugging sessions for troubleshooting workloads and
nodesAdvanced Commands:diff Diff live version against would-be applied versionapply Apply a configuration to a resource by filename or stdinpatch Update field(s) of a resourcereplace Replace a resource by filename or stdinwait Experimental: Wait for a specific condition on one or many
resources.kustomize Build a kustomization target from a directory or a remote url.Settings Commands:label Update the labels on a resourceannotate Update the annotations on a resourcecompletion Output shell completion code for the specified shell (bash or
zsh)Other Commands:api-resources Print the supported API resources on the serverapi-versions Print the supported API versions on the server, in the form of
"group/version"config Modify kubeconfig filesplugin Provides utilities for interacting with plugins.version Print the client and server version informationUsage:kubectl [flags] [options]Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all
commands).
3.5 配置Master节点的网络
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
kubectl apply -f calico.yaml
3.6 安装Dashboard
3.6.1 安装Dashboard
安装Dashboard的命令行如下:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml
kubectl get pods --all-namespaces | grep dashboard
kubernetes-dashboard dashboard-metrics-scraper-7445d59dfd-pvr5q 1/1 Running 3 6d23h
kubernetes-dashboard kubernetes-dashboard-5d6fdccd5-l5bk7 1/1 Running 3 6d23h
3.6.2 创建Dashboard用户
创建一个用于登录 Dashboard 的用户. 创建文件dashboard-adminuser.yaml内容如下:
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kube-system
并执行下面的命令
kubectl apply -f dashboard-adminuser.yaml
3.6.3 生成Dashboard证书
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
3.6.4 登陆Dashboard
打开 Dashboard的时候,会首先进入下面的认证的页面。
一般我们会使用第二种方式,就是获取到Token,其命令如下
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
拷贝上面Token的值,注意不要包括前面的空格
至此,所有的Docker的列表如下:
4. 配置Worker节点并加入Master节点
Worker节点的加入比较简单,直接执行上面提到的 “kubeadm join ” 命令
kubeadm join 172.24.137.71:6443 --token 6s1u3g.rns2x03czqjux1x1 \--discovery-token-ca-cert-hash sha256:da3ffd7e60b1ad55f2a95ea6375f15deb21d09299eb0b803b9f7fb8a4ad0a356
5. 常见问题
5.1 Worker节点执行kubectl失败
k8s集群slave节点使用kubectl命令时The connection to the server localhost:8080 was refused - did you specify the right host or port?
mkdir -p /root/.kube
scp root@172.24.137.71:/root/.kube/* /root/.kube 或者 cp -i /etc/kubernetes/admin.kubeconfig /root/.kube/config
kubectl get nodes
5.2 Dashboard在公网环境下不能访问登陆页面
Dashboard在公网环境下不能打开下面的访问登陆页面,
解决方案:
在Master节点执行下面的命令
kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous
5.3 在Join Master节点的时候,一直在“pre flight”命令行下不动
Worker节点在加入Master节点时,一直在“pre flight”命令行下不动
kubeadm join 172.24.137.71:6443 --token 6s1u3g.rns2x03czqjux1x1 \--discovery-token-ca-cert-hash sha256:da3ffd7e60b1ad55f2a95ea6375f15deb21d09299eb0b803b9f7fb8a4ad0a356
解决办法: 原因是Master生成的Token过期了
登陆到Master服务器上
3.1 原因是第一次生成的Token 过期了
kubeadm token list //token列表 ,第一次登陆上去,应该列表是空的kubeadm token create --ttl 0 //永不失效 kubeadm token create //有效期一天
3.2 看出CA Token,一般CA Token是不会过期的
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
46f6cf1d84d0eadb4f6e7f05b908e5572025886d9f134db27f92b98e1c3dd3ed //token
3.3 重新生成新的Worker加入Master节点的命令
kubeadm join 172.24.137.71:6443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:da3ffd7e60b1ad55f2a95ea6375f15deb21d09299eb0b803b9f7fb8a4ad0a356
参考文档
kubernetes join 卡住 token过期
Kubernetes(一) 跟着官方文档从零搭建K8S
从零开始搭建一个K8S的环境相关推荐
- 从零开始搭建一个vue项目 -- vue-cli/cooking-cli(一)
从零开始搭建一个vue项目 -- vue-cli/cooking-cli(一) 1.vue-cli搭建一个可靠成熟的项目 1.介绍 vue-cli 我是去年六月份接触的vue1.0,当时还是个菜逼,当 ...
- github项目怎么运行_利用 GitHub 从零开始搭建一个博客
"NightTeam",一个值得加星标的公众号. 趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了. 由于 NightTeam 的域 ...
- 使用 kind 快速搭建一个 Kubernetes 测试环境
使用 kind 快速搭建一个 Kubernetes 测试环境 Intro kind(Kubernetes IN Docker) 是一个基于 docker 构建 Kubernetes 集群的工具,非常适 ...
- 利用 GitHub 从零开始搭建一个博客
"NightTeam",一个值得加星标的公众号. 趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了. 由于 NightTeam 的域 ...
- 如何利用 GitHub 从零开始搭建一个博客
趁着周末,搭建了一下 NightTeam 的官方博客和官方主页,耗时数个小时,两个站点终于完工了. 由于 NightTeam 的域名是 nightteam.cn,所以这里官方博客使用了二级域名 blo ...
- 从零开始搭建一个GIS开发小框架(一)——基本框架
目录 1.概述 1.1 项目背景 1.2 传送门 2.技术选型:GMap.NET 3.底图功能实现 2.1 方式一:在线地图(以高德为例) 2.2 greatmaps生成底图(瓦片地图) 3.搭建主程 ...
- spring boot:从零开始搭建一个项目 - day 4 控制台输出日志美化 + swagger2
spring boot:从零开始搭建一个项目 - day 4 控制台输出日志美化 + swagger2 一.logback.xml配置日志美化 二.集成swagger2 1.引入依赖 2.编写配置文件 ...
- 从零开始搭建一个语音对话机器人
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] ♪ 点击上方绿标 收听从零开始搭建一个语音对话机器人 从零开始搭建一个语音对话机器人 目录 01-初心缘由 01-准备工作 02-语音机器 ...
- espeak 中文语音包_从零开始搭建一个语音对话机器人
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] ♪ 点击上方绿标 收听从零开始搭建一个语音对话机器人 从零开始搭建一个语音对话机器人 目录 01-初心缘由 01-准备工作 02-语音机器 ...
- 从零开始搭建一个管理系统-vue3.0项目创建-----1
从零开始搭建一个管理系统-vue3.0项目创建-----1 讲在前面 webpack构建项目 代码编辑器 依赖修改 码云代码地址 讲在前面 假设你已了解关于 HTML.CSS. JavaScript ...
最新文章
- 张一鸣的微博世界-组织篇
- rust 手动关闭子线程_从零开始写 OS (9) —— 内核线程
- SVN的搭建及使用(三)用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突,重新设置用户名和密码等...
- 【转】matlab 生成调用c/c++ 代码 mex 简单实用——修改部分
- 可被三整除的最大和—leetcode1262
- 详解log4j2(下) - Log4j2在WEB项目中配置
- 如何在vue项目中使用sass(scss)
- 数据结构学习笔记:实现链表
- e5 2630v4 php性能,至强E5 V4性能表现测试
- w我的世界pe开服器php7,我的世界手机自主开启PE服务器教程
- 学python能做什么-学Python后到底能干什么?网友:我太难了
- Docker 安装(学习笔记一)
- 游戏陪玩小程序开发制作
- 【分子动力学模拟】centos7使用gmx_MMPBSA时使用gmx_MMPBSA_ana时无法调用pyqt5
- Linux环境变量PSI指什么,psi是什么单位(pSI指标应用原则)
- BUUCTF WEB Easy Calc
- java复制屏幕文本内容_网页上的文字内容不给复制?电脑老司机教你输入一串代码,轻松复制...
- 重庆大学计算机学院张敏,张敏(安徽大学生命科学学院院长)_百度百科
- 栈与堆的区别(内存分配与数据结构)
- idea中vue文件 游览器图标_vue项目中icon图标的完美引入
热门文章
- win环境下jdk7与jdk8共存问题
- shiro+springMVC整合文档及Demo
- linux设置ipsan_Linux挂载IPSAN和FCSAN操作
- 【财富空间】郝景芳:如何不被未来折叠
- “数据折叠:那些AI背后“标数据的人”正在回家
- 饥荒联机一直显示正在启动服务器,饥荒联机版一直正在启动服务器 | 手游网游页游攻略大全...
- Redis 下载安装教程 及 客户端可视化工具
- JavaScript——利用正则表达式实现二代身份证号码的验证
- 专家称摩尔定律将于2022年失效
- ros各级授权的区别