什么是 Kubernetes
随着微服务架构被越来越多的公司使用,大部分单体应用正逐步被拆解成小的、独立运行的微服务。微服务的优势这里不做探讨,但是其带来的服务维护问题大大增加,若想要在管理大量微服务的情况下还需要让资源利用率更多且硬件成本相对更低,那么基于容器部署的微服务的一些自动化设施的需求就这样诞生了,于是就有了 Kubernetes,其提供的特性有:
- 服务发现和负载均衡
- 存储编排
- 自动发布和回滚
- 自愈
- 密钥及配置管理
安装
单机安装
关于单机安装k8s
,我使用的相关环境如下:
- macOS:Catalina 10.15.1
- Docker Desktop Vesion:3.0.2
- Kubernetes:1.19.3
由于镜像的下载涉及到网络原因,因此这里使用了开源项目k8s-docker-desktop-for-mac[1]来解决这个问题,需要注意的是要修改images
的相关镜像的版本,要和此时Kubernetes
配对上才行,比如我设置的是:
k8s.gcr.io/kube-proxy:v1.19.3=gotok8s/kube-proxy:v1.19.3 k8s.gcr.io/kube-controller-manager:v1.19.3=gotok8s/kube-controller-manager:v1.19.3 k8s.gcr.io/kube-scheduler:v1.19.3=gotok8s/kube-scheduler:v1.19.3 k8s.gcr.io/kube-apiserver:v1.19.3=gotok8s/kube-apiserver:v1.19.3 k8s.gcr.io/coredns:1.7.0=gotok8s/coredns:1.7.0 k8s.gcr.io/pause:3.2=gotok8s/pause:3.2 k8s.gcr.io/etcd:3.4.13-0=gotok8s/etcd:3.4.13-0
随后打开Docker
,进入设置界面,勾选Enable Kubernetes
即可:
不出意外,界面左下角会出现Kubernetes running
的提示,这样就安装成功了。
如果状态一直处于Kubernetes starting
状态,可在终端执行以下命令然后重启Docker
:
rm -rf ~/.kube rm -rf ~/Library/Group\ Containers/group.com.docker/pki/
集群安装
准备
- 准备三台机器,比如(使用的配置是 4 核 8G,IP 换成你自己的):
- 执行:
hostnamectl set-hostname node02
echo "127.0.0.1 $(hostname)" >> /etc/hosts
- 执行:
hostnamectl set-hostname node01
echo "127.0.0.1 $(hostname)" >> /etc/hosts
- 执行:
hostnamectl set-hostname master
echo "127.0.0.1 $(hostname)" >> /etc/hosts
- 192.16.0.11:Master:
- 192.16.0.12:Node01
- 192.16.0.13:Node02
- Kubernetes 版本:v1.19.3
- Docker 版本:19.03.12
开始前请检查以下事项:
- CentOS 版本:>= 7.6
- CPU:>=2
- IP:互通
- 关闭swap:
swapoff -a
配置国内 kubernetes 源:
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=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安装相关依赖工具:
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3 # 设置开机启动 systemctl enable kubelet.service && systemctl start kubelet.service # 查看状态 systemctl status kubelet.service
初始化 Master
在主节点(192.16.0.11
)执行以下命令:
export MASTER_IP=192.168.5.91 export APISERVER_NAME=apiserver.demo export POD_SUBNET=10.100.0.1/16 echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
新建脚本init_master.sh
:
vim init_master.sh
添加:
#!/bin/bash # 只在 master 节点执行 # 脚本出错时终止执行 set -e if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m" echo 当前POD_SUBNET=$POD_SUBNET echo 当前APISERVER_NAME=$APISERVER_NAME exit 1 fi # 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2 rm -f ./kubeadm-config.yaml cat <<EOF > ./kubeadm-config.yaml apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration # k8s 版本 kubernetesVersion: v1.19.3 imageRepository: registry.aliyuncs.com/k8sxio controlPlaneEndpoint: "${APISERVER_NAME}:6443" networking: serviceSubnet: "10.96.0.0/16" podSubnet: "${POD_SUBNET}" dnsDomain: "cluster.local" EOF # kubeadm init # 根据您服务器网速的情况,您需要等候 3 - 10 分钟 kubeadm config images pull --config=kubeadm-config.yaml kubeadm init --config=kubeadm-config.yaml --upload-certs # 配置 kubectl rm -rf /root/.kube/ mkdir /root/.kube/ cp -i /etc/kubernetes/admin.conf /root/.kube/config # 安装 calico 网络插件 # 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises echo "安装calico-3.13.1" rm -f calico-3.13.1.yaml wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml kubectl apply -f calico-3.13.1.yaml
如果出错:
# issue 01 # [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1 # 所有机器执行 echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
检查master
初始化结果:
# 直到所有的容器组处于 Running 状态 watch kubectl get pod -n kube-system -o wide # 查看 master 节点初始化结果 kubectl get nodes -o wide
如下图:
获得 join 命令参数
直接在master
执行:
kubeadm token create --print-join-command
比如此时输出:
# 有效期两小时 kubeadm join apiserver.demo:6443 --token vh5hl9.9fccw1mzfsmsp4gh --discovery-token-ca-cert-hash sha256:6970397fdc6de5020df76de950c9df96349ca119f127551d109430c114b06f40
初始化 Node
在所有node
执行:
export MASTER_IP=192.168.5.91 export APISERVER_NAME=apiserver.demo echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts # 替换为 master 节点上 kubeadm token create 命令的输出 kubeadm join apiserver.demo:6443 --token vh5hl9.9fccw1mzfsmsp4gh --discovery-token-ca-cert-hash sha256:6970397fdc6de5020df76de950c9df96349ca119f127551d109430c114b06f40
检查初始化结果
在master
节点执行:
kubectl get nodes -o wide
输出结果如下:
Kubernetes Dashboard
Dashboard[2]可以将容器化应用程序部署到Kubernetes
集群,对容器化应用程序进行故障排除,以及管理集群资源。
安装
安装命令如下:
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml -O recommended.yaml kubectl apply -f recommended.yaml kubectl get pods --namespace=kubernetes-dashboard -o wide
此处执行完会发现STATUS
都是ContainerCreating
:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dashboard-metrics-scraper-79c5968bdc-bdz9d 1/1 `ContainerCreating` 0 100m 10.1.0.20 docker-desktop <none> <none> kubernetes-dashboard-7448ffc97b-z8222 1/1 `ContainerCreating` 0 100m 10.1.0.19 docker-desktop <none> <none>
查看日志找找原因(注意 NAME):
kubectl describe pod dashboard-metrics-scraper-79c5968bdc-bdz9d --namespace=kubernetes-dashboard
发现是因为metrics-scraper:v1.0.6
镜像下载不下来,手动执行:
docker pull kubernetesui/metrics-scraper:v1.0.1
拉下来之后就妥了。
最后我们需要将访问形式改为NodePort
访问:
kubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard # 将里面的 type: ClusterIP 改为 type: NodePort
保存后,执行:
kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
终端输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes-dashboard NodePort 10.98.194.124 <none> 443:31213/TCP 107m
Token
在浏览器访问:https://0.0.0.0:31213/
:
看界面需要生成Token
:
vim admin-user.yaml # 输入 apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard # 保存退出 vim admin-user-role-binding.yaml # 输入 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard # 保存退出 # 执行命令加载配置 kubectl create -f admin-user.yaml kubectl create -f admin-user-role-binding.yaml # 若出现已存在 # 执行:kubectl delete -f xxx.yaml 即可
获取令牌:
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
复制token
到刚才的界面登录即可,登录后界面如下:
如果想延长Token
的有效时间:
然后在containners->args
加上--token-ttl=43200
。
部署镜像
下拉一个你自己想部署的镜像,具体命令如下(主节点执行):
# 部署 kubectl run hello --image=xxx/hello --port=5000 # 列出 pod kubectl get pods # 创建一个服务对象 # NodePort 在所有节点(虚拟机)上开放一个特定端口,任何发送到该端口的流量都被转发到对应服务 kubectl expose po hello --port=5000 --target-port=5000 --type=NodePort --name hello-http # 列出服务 kubectl get services
参考
- 本部分参考文章如下:
- 使用 kubeadm 安装 kubernetes_v1.19.x[3]
- Web 基础配置篇(十六): Kubernetes 集群的安装使用[4]
- Kubernetes in Action 中文版
参考资料
[1]
k8s-docker-desktop-for-mac:https://github.com/gotok8s/k8s-docker-desktop-for-mac
[2]
Dashboard:https://github.com/kubernetes/dashboard
[3]
使用kubeadm安装kubernetes_v1.19.x:https://kuboard.cn/install/install-k8s.html#%E6%A3%80%E6%9F%A5-centos-hostname
[4]
Web基础配置篇(十六): Kubernetes集群的安装使用:https://www.pomit.cn/p/2366402025269761#1010602