目录
一、Kubernetes 简介
1.1 Kubernetes 特点
1.2 Kubernetes 版本
1.3 Kubernetes 详解
二、环境介绍
三、安装要求
3.1 主要安装软件及版本
四、准备工作
4.1 安装必要的rpm软件
4.2 关闭防火墙
4.3 关闭selinux
4.4 禁用交换分区
4.5 配置域名解析
4.6 修改内核参数
4.7 配置yum源
五、安装 Docker
5.1 安装docker
六、安装 kubernetes
6.1 添加 Kubernetes 阿里云 yum 源
6.2 安装 kubeadm、kubelet 和 kubectl
6.3 部署Kubernetes Master节点
6.4 安装 Pod 网络插件(CNI)
6.5 部署 Kubernetes Node 节点
6.6 测试 kubernetes 集群
6.7 Dashboard 安装(Kubernetes Web UI 界面)
6.8 使用 Token 登陆 Dashboard
七、参考资料
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
通过Kubernetes你可以:
快速部署应用、
快速扩展应用、
无缝对接新的应用功能、
节省资源,优化硬件资源的使用。
可移植: 支持公有云,私有云,混合云,多重云(multi-cloud);
可扩展: 模块化,插件化,可挂载,可组合;
自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展。
官网地址:kubernetes.io(外网,近期连接很慢,甚至连接不上,查阅资料很不方便)。
目前官网最新版本是:v1.18.0-beta.1,18 版还没有出正式版。正式版里最新版本为 v1.17.3,支持的系统版本至少是 Centos 7.6。笔者拿到的测试环境系统是 Centos 7.5,所以选择安装的是稳定版:kubernetes v1.15.0。
目前官网了解途径不顺利,因此找了两个网址做详细了解:
Kubernetes(k8s)|中文文档 http://docs.kubernetes.org.cn/227.html
kubernetes简介 https://blog.51cto.com/12974849/2476138
操作系统:Centos 7.5.1804
服务器:3 台
主机名 | IP 地址 | 操作系统 | 主机角色 |
k8s1 | 10.0.0.176 | CentOS 7.5.1804 | k8s-master |
k8s2 | 10.0.0.177 | CentOS 7.5.1804 | k8s-node |
k8s3 | 10.0.0.178 | CentOS 7.5.1804 | k8s-node |
在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
· 一台或多台机器,操作系统 CentOS7.x-86_x64
· 硬件配置:内存 2GB+ ,2 核 CPU+(实验环境配置稍低也可以)
· 集群中所有机器之间网络互通
· 可以访问外网,需要拉取镜像
· 禁止 swap 分区
Docker: 18.06.1-ce
Kubelet: v1.15.0
Kubectl: v1.15.0
Kubeadm: v1.15.0
所有的节点都进行配置。
## 安装wget vim net-tools epel-release
yum install -y wget vim net-tools epel-release
## 安装 nfs-utils
## 必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
swapoff -a
# 如需要永久禁用(可选),打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
# 修改 /etc/hosts
cat <> /etc/hosts
10.0.0.176 k8s1
10.0.0.177 k8s2
10.0.0.178 k8s3
EOF
# 将桥接的IPv4流量传递到iptables的链
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
## 配置默认源
# 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 下载阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 更新缓存
yum clean all
yum makecache fast
Docker 版本众多,但为了适配 Kubernetes v1.15.0,本次安装选择的是:18.06.1-ce。
所有的节点都进行配置。
如果已经安装了docker,可先卸载,具体步骤参考:
https://www.jianshu.com/p/ef3a041031d2
下载 docker 的 yum 源文件,
# 安装依赖
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
这里可以先查看支持的版本,本文安装指定docker版本,
yum list docker-ce --showduplicates | sort -r
* updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
* extras: mirrors.aliyun.com
* epel: hkg.mirror.rackspace.com
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable
...
...
...
* base: mirrors.aliyun.com
目前最新版本为 19.03.7-3.el7,本次安装指定版本 18.06.1-ce,
yum -y install docker-ce-18.06.1.ce-3.el7 # 要指定该版本安装
# 设置开机启动
systemctl enable docker
# 启动 docker
systemctl start docker
查看 docker 是否已成功安装并启动,
# 查看版本
docker --version
Docker version 18.06.1-ce, build e68fc7a
# 查看docker服务
systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-12 01:01:20 CST; 12min ago
Docs: https://docs.docker.com
Main PID: 17443 (dockerd)
...
docker 打印 hello-world,
# docker run hello-world
Hello from Docker
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
...
# docker 安装完成后测试hello-world出现问题(Unable to find image 'hello-world:latest' locally)
docker 在本地没有找到 hello-world 镜像,也没有从 docker 仓库中拉取镜像,出现这个问题的原因:docker 服务器在国外,在国内无法正常拉取镜像,所以就需要为 docker 设置阿里云的镜像加速器。
需要修改配置文件,
vim /etc/docker/daemon.json # 如果没有就创建
{
"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}
保存并退出,并且重启docker服务,
systemctl restart docker
docker重启之后,就可以正常拉取 helloworld 镜像了。
6.1、6.2 步骤三台服务器都配置。
# [] 中括号中的是repository id,唯一,用来标识不同仓库
# name 仓库名称,自定义
# baseurl 仓库地址
# enable 是否启用该仓库,默认为1表示启用
# gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
# repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
# gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
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
# 更新缓存
yum clean all
yum makecache fast
本文安装版本 v1.15.0,安装时指定版本号:
# kubeadm: 用于初始化集群,启动集群的命令工具
# kubelet:集群中运行任务的代理程序,运行在集群所有节点上,用于启动Pod和容器等对象的工具
# kubectl:命令行管理工具,用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
yum install -y kubelet-1.15.0 kubeadm-1.15.0 kubectl-1.15.0
# 设置开机启动,这里暂不启动kubelet
systemctl enable kubelet
只在master节点配置。
kubeadm init \
--apiserver-advertise-address=10.0.0.176 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.15.0 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
由于默认拉取镜像地址 k8s.gcr.io 现阶段国内无法访问,这里指定阿里云镜像仓库地址。
备注:记得修改主机 IP 地址、kubernetes 版本。
初始化完成,页面最下面会生成 token,记得复制下来,一会后面要用到。
kubeadm join 10.0.0.176:6443 --token mksask.1xn58bt51daiqbf1 \
--discovery-token-ca-cert-hash sha256:52e27adaf2747ec921f8203960aea316adc40fe75684ca047392d73d41bcda27
使用 kubectl 工具,执行: (备注:仅master上面执行)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看 .kube 目录,会在根目录下面生成 config 文件,
ls .kube/
cache config http-cache
查看节点状态,
kubectl get node
NAME STATUS ROLES AGE VERSION
k8s1-mathartsys-com NotReady master 11m v1.15.0
## 这是正常的。因为没有安装容器网络(Pod),所以是没有准备好的状态。
只在master节点配置。
## 下载kube-flannel.yml源
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 修改镜像地址
sed -i 's/quay.io\/coreos/registry.cn-beijing.aliyuncs.com\/imcto/g' kube-flannel.yml
## 运行kube-flannel.yml文件
kubectl apply -f kube-flannel.yml
向集群添加新节点,执行在 kubeadm init 输出的 kubeadm join 命令:
## 在2个节点上执行
kubeadm join 10.0.0.176:6443 --token mksask.1xn58bt51daiqbf1 \
--discovery-token-ca-cert-hash sha256:52e27adaf2747ec921f8203960aea316adc40fe75684ca047392d73d41bcda27
在 Kubernetes 集群中创建一个 pod,验证是否正常运行:
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-554b9c67f9-zz6kr 1/1 Running 0 39h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.1.0.1 443/TCP 46h
service/nginx NodePort 10.1.41.17 80:31547/TCP 39h
访问地址:http://NodeIP:Port(本次安装对应地址:http://10.0.0.176:31547)
在master节点进行执行。
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
下载kubernetes-dashboard.yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
默认镜像国内无法访问,修改镜像地址为: lizhenliang/kubernetes-dashboard-amd64:v1.10.1。
另外,默认 Dashboard 只能集群内部访问,需要修改 Service 为 NodePort 类型(暴露给外部)并添加端口 nodePort: 30001,这样才能访问。
## 修改kubernetes-dashboard.yaml文件(注释出 #...)
vi kubernetes-dashboard.yaml
# ------------------- Dashboard Deployment ------------------- #
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
k8s-app: kubernetes-dashboard
template:
metadata:
labels:
k8s-app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
# image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
image: lizhenliang/kubernetes-dashboard-amd64:v1.10.1
# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
# 新加 type:NodePort
type: NodePort
ports:
- port: 443
targetPort: 8443
# 新加 nodePort: 30001
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
## 运行kubernetes-dashboard.yaml文件
kubectl apply -f kubernetes-dashboard.yaml
secret/kubernetes-dashboard-certs unchanged
serviceaccount/kubernetes-dashboard unchanged
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal unchanged
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal unchanged
deployment.apps/kubernetes-dashboard configured
service/kubernetes-dashboard configured
所有节点拉取镜像,
docker pull lizhenliang/kubernetes-dashboard-amd64:v1.10.1
等待镜像拉取完后,master 节点检查状态
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-7b4657785d-q4vzg 1/1 Running 0 40h
calico-node-27s72 1/1 Running 0 40h
calico-node-nrzbf 1/1 Running 0 40h
calico-node-x7w9j 1/1 Running 0 40h
coredns-bccdc95cf-lk5h2 1/1 Running 0 46h
coredns-bccdc95cf-sx4vm 1/1 Running 0 46h
etcd-k8s1-mathartsys-com 1/1 Running 0 46h
kube-apiserver-k8s1-mathartsys-com 1/1 Running 0 46h
kube-controller-manager-k8s1-mathartsys-com 1/1 Running 0 46h
kube-flannel-ds-amd64-5xblm 1/1 Running 0 41h
kube-flannel-ds-amd64-c42b2 1/1 Running 0 40h
kube-flannel-ds-amd64-dtklt 1/1 Running 0 40h
kube-proxy-2dtdh 1/1 Running 0 46h
kube-proxy-gvkwq 1/1 Running 0 40h
kube-proxy-x7v4z 1/1 Running 0 40h
kube-scheduler-k8s1-mathartsys-com 1/1 Running 0 46h
kubernetes-dashboard-79ddd5-9zgln 1/1 Running 0 30h
如果镜像拉取失败或没拉取完,会有服务显示 ImagePullBackOff 或 Pending 或 Init 状态:
NAME READY STATUS RESTARTS AGE
coredns-8686dcc4fd-hldfb 1/1 Pending 0 120m
coredns-8686dcc4fd-tnxhp 1/1 Pending 0 120m
kube-scheduler-k8s1-mathartsys-com 0/1 ImagePullBackOff 0 46h
kubernetes-dashboard-79ddd5-9zgln 0/1 ImagePullBackOff 0 30h
...
创建 service account 并绑定默认 cluster-admin 管理员集群角色(仅在master上面操作),
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,下一步使用 Token 登陆 Dashboard
token:
eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tdjdyd3ciLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjcyNjE1MDktYjFiNS00YTE0LWE1ODctMTZmMjc2OGNjOGY1Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.fdhlU0xDJ60sz8lXzuimPGL_Dz6lePrgh9ORZLW-SWBsCq2cTTkKGKfjDmu2cwmbunkO4AU9ZLIzHmR-7LYTS6hzJNSpT_ZCuKEwuZs4IdMwlHqQlVbN9jlMf5TsDxU6WU2BzxCytXBpgKbJGbfbEHnZmBPVsKUjuTFvgPKVPM3BsUKdva0LLxKTa4F5dm2yNX6N0wNXzFCPrj_tcJnmghRvnOoUAvW2cpy8Z2ARpMx0ZauhD5tpIrm7tmSDlxPMj_0RDX8BykrIiR5Ic8evcTmYdidPnzPKgQ5iPCptE6ZIhwQhJQjzuNNU6zPu58Ynfhroh75T9yOgWCaqLFE08w
也可以查看 Token:
kubectl describe secrets -n kube-system dashboard-admin
Dashboard提供了可以实现集群管理、工作负载、服务发现和负载均衡、存储、字典配置、日志视图等功能。
本次登陆使用浏览器:谷歌浏览器。
访问地址:https://NodeIP:30001(https://10.0.0.176:30001)
访问该地址时,报错:NET::ERR_CERT_INVALID
解决办法:https://blog.51cto.com/mapengfei/2476429
在当前页面打开的时候点网页任意地方,不是在输入框,不是在输入框,不是在输入框,在 chrome 该页面上,直接键盘敲入这11个字符:thisisunsafe (鼠标点击当前页面任意位置,让页面处于最上层即可输入)
选择Token登陆,输入上面拷贝的Token,登入Dashboard。
至此,已经安装好k8s。
如果 Token 没有拷贝,可以查找:
kubectl describe secrets -n kube-system dashboard-admin
1. 部署 k8s Web UI
https://edu.51cto.com/center/course/lesson/index?id=426979
2. 使用 Kubeadm 快速部署一个 k8s 集群
https://www.cnblogs.com/nulige/articles/10941218.html
3. 快速部署一个 Kubernetes 集群
https://blog.51cto.com/11971822/2476364
4. CentOS7 利用 kubeadm 快速部署 k8s 集群
https://blog.51cto.com/innocence/2433112?source=dra
5. kubeadm 安装 k8s
https://www.cnblogs.com/Vivi-87/p/11169177.html
6. centos 7 安装 kubernetes
https://www.cnblogs.com/zhuzi91/p/12357971.html
以上资料只是参考,最好提前了解 kubernetes 的基本概念,自己动手搭建 k8s 集群,如遇问题,多去搜索查阅资料。以上也只是入门,笔者也是初识 K8S。