Docker kubeadm 部署 kubernetes

xinxi · 2020年02月02日 · 2246 次阅读

介绍

一直以来部署 kubernetes 都非常难,因为需要专业 SltStack、Ansilbe 等专业运维工具,本文介绍使用 kubeadm 来部署 kubernetes 环境.

另外在极客时间卖桃者说第 193 期介绍了 kubeadm 部署 kubernetes,其中提到了一个思想"要真正发挥容器技术的实力,你就不仅仅局限于对 Linux 容器本身的钻研和使用".

所以建议我们来亲手部署一套环境后,再来慢慢深入学习其中的奥秘.

环境准备

如果没有服务器,可以在阿里云上按照流量租几台服务器,
这几个服务器最好是一个区的并且在一个内网网段上.

服务配置

image

image

配置列表

主机名 IP 角色
k8s-master 192.168.1.1 master 节点
k8s-node01 192.168.1.2 集群 worke 节点

kubeadm 介绍

kubeadm 能帮助您建立一个小型的符合最佳实践的 Kubernetes 集群工具.

https://github.com/kubernetes/kubeadm

kubeadm 成熟度

kubeadm 的整体功能目前还是 Beta 状态,不太适部署在生成环境中.

image

kubeadm 部署

分别在三台机器执行对应命令,设置主机名

重新登录服务器才生效

[root@centos01 ~]# hostnamectl set-hostname k8s-master
[root@centos02 ~]# hostnamectl set-hostname k8s-node01

关闭防火墙、selinux

[root@centos01 ~]# systemctl disable firewalld
[root@centos01 ~]# systemctl stop firewalld
[root@centos01 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

设置内核

[root@centos01 ~]# vim /etc/sysctl.d/k8s.conf
## 添加如下内容
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
## 执行命令生效
[root@centos01 ~]# modprobe br_netfilter
[root@centos01 ~]# sysctl -p /etc/sysctl.d/k8s.conf

免密钥

在 master 节点进行对 2 台 node 节点进行免密钥登陆

[root@k8s-master ~]# ssh-keygen
[root@k8s-master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.0.11
[root@k8s-master ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.10.0.12

部署 kubernetes 集群

配置 yum 源

yum 源三台机器都需要配置,这里我们以 master 主机为例,node 节点也按照此 yum 配置即可

[root@k8s-master ~]# yum -y install wget
[root@k8s-master ~]# cd /etc/yum.repos.d
## 配置docker-ce源
[root@k8s-master yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## 配置kubernetes源
[root@k8s-master yum.repos.d]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1   
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
enabled=1
## 下载校验文件
[root@k8s-master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[root@k8s-master ~]# wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
## 导入校验文件
[root@k8s-master ~]# rpm --import rpm-package-key.gpg
[root@k8s-master ~]# rpm --import yum-key.gpg
[root@k8s-master ~]# yum clean all  && yum makecache fast

安装 docker、kubelet、kubeadm 等工具

[root@k8s-master ~]# yum  install kubelet-1.14.1 kubeadm-1.14.1 kubectl-1.14.1 docker-ce -y
## node节点无需配置kubctl组件
[root@k8s-node01 ~]# yum  install kubelet-1.14.1 kubeadm-1.14.1 docker-ce -y
[root@k8s-node02 ~]# yum  install kubelet-1.14.1 kubeadm-1.14.1 docker-ce -y

配置 docker kubelet

## 设置kubelet启动时忽略swap报错
[root@k8s-master ~]# vim /etc/sysconfig/kubelet 
 KUBELET_EXTRA_ARGS="--fail-swap-on=false"
## 设置开机自启动
[root@k8s-master ~]# systemctl daemon-reload 
[root@k8s-master ~]# systemctl enable docker && systemctl restart docker
[root@k8s-master ~]# systemctl enable kubelet && systemctl restart kubelet

初始化 master 节点

kubernetes 从 1.13 版本开始,可以指定镜像仓库进行集群初始化操作,所以我们直接指定阿里云镜像仓库进行集群初始化,这样无需再关心国内网络环境是否可以下载到对应的官方原始 pod 镜像

[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# kubeadm init --apiserver-advertise-address=10.10.0.10 \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version v1.14.1 \
 --pod-network-cidr=10.244.0.0/16

参数解释:

  • apiserver-advertise-address:apiserver 地址及 master 节点地址
  • image-repository:镜像仓库地址
  • pod-network-cidr:pod 网络

初始化 master 的相关日志如下

........
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.10.0.10:6443 --token 5ti5kd.o32bm9lofv6zej94 \
    --discovery-token-ca-cert-hash sha256:cd778ad01bdbc656eaff7d3b1273691f0070ebbadd2f1b8a3189a6dc1e88f39f

配置集群环境变量

[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $(id -u):$(id -g) $HOME/.kube/config
## 查看集群信息
[root@k8s-master ~]# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}
## 查看node就绪状态
### 由于还没有安装网络插件,以及node节点未加入集群,所以只显示一个master节点信息
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS     ROLES    AGE     VERSION
k8s-master   NotReady   master   7m33s   v1.14.1

部署网络插件

集群的运行依赖于网络,k8s 本身并不支持网络,需要额外部署对应的网络插件,才可实现集群的个组件网络通信。我们这里采用 flannel 作为集群网络插件。

项目地址:https://github.com/coreos/flannel

## 在线部署
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 或者把清单配置文件下载本地再执行清单文件应用
[root@k8s-master ~]# mkdir /opt/k8s/flannel
[root@k8s-master ~]# cd /opt/k8s/flannel
[root@k8s-master ~]# wget  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml

node 节点加入集群

node 节点加入集群操作基本一致,这里以其中一台为例。kubeadm join 命令为 master 节点初始化成功后显示的命令,上文已经提到过。

swapoff -a

kubeadm join 10.10.0.10:6443 --token 5ti5kd.o32bm9lofv6zej94 \
     --discovery-token-ca-cert-hash sha256:cd778ad01bdbc656eaff7d3b1273691f0070ebbadd2f1b8a3189a6dc1e88f39f

查看节点就绪状态

kubectl get nodes

image

集群删除

kubeadm reset
ifconfig cni0 down && ip link delete cni0
ifconfig flannel.1 down && ip link delete flannel.1
rm -rf /var/lib/cni/

kubernetes-dashboard

kubernetes-dashboard 是一个 kubernetes 可视化 web 操作平台.

部署

kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

创建用户

创建服务账号

# admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system

执行命令: kubectl create -f admin-user.yaml  

绑定角色

# admin-user-role-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system

登录页面

https://121.43.234.42:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

查看 token

kubeadm token list

image

token

eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRwcG04Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2MTgxNGE2YS00NGVhLTExZWEtOWZmZi0wMDE2M2ViYzE5YmMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.V1Z50nShNQCwlsP4xPWbZawRWaZxUTn96NSUB8DDq5Ux6eNf1IePFYVU0DS6MK1eitoq93VxH7dRybifaYCNYgA8AM_6P6CMRmFob96W3LXjnSyBlq9dxd_T_dgPeeo5hvL9ZGt0vDFQk4U7BAKNipGUWIBCjT4BsimzTe7d3CyV4uc8pK84hFRPY8286N524lm8wYN3_HOun51SqjG1a8C3D_TTm0cQXMuyIrz3aUSKCVv9qLJIzZOckEQ-MrKACU_b18K4Zm_8ATcsh6jQhM_GFTHnudLMM0k0vqozLF_tsXjBLsrePe_n5kg-jewbUYVkRPE7pltHZ6DQG-wrmw

访问方式

k8s 提供了几种访问方式,比如代理、apiserver、node 等

代理方式

kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

启动代理

kubectl proxy --address='0.0.0.0' --port=8888 --accept-hosts='^*$'

image

这种访问无法登录.

image

API Server

https://121.43.234.42:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

image

https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

image

这是因为最新版的 k8s 默认启用了 RBAC,并为未认证用户赋予了一个默认的身份:anonymous。

创建证书

cp /etc/kubernetes/admin.conf $HOME/.kube/config

# 生成client-certificate-data
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt

# 生成client-key-data
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key

# 生成p12
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

image

image

配置 https 证书

由于证书问题,我们无法访问,需要在部署 Dashboard 时指定有效的证书,才可以访问。由于在正式环境中,并不推荐使用 NodePort 的方式来访问 Dashboard.

image

面板操作

访问地址

https://121.43.234.42:6443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/overview?namespace=default

![image]http://note.youdao.com/yws/public/resource/738d61647ff1969d526fe7c3a58236dd/A2C485A4E88F425FBBE47541CD4445F6?ynotemdtimestamp=1580629683483)

伸缩容器

image

image

image

查看相关 API

image

解决 k8s 的 nodePort,外网不能访问

iptables -P FORWARD ACCEPT

部署测试服务集群

以 nginx 为例,部署测试服务.

命令方式

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort

查看部署的 pods

kubectl get pods

文件形式

nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

默认部署在 default namespace

kubectl apply -f nginx-deployment.yaml

查看部署

kubectl get deployments

查看 pod 详情

kubectl describe pod demo-tomcat-6894dcb86b-jtbmt

image

常用命令

查看 pod 状态

kubectl get pod --namespace=kube-system -o wide | grep dashboard

查看 dashboard 被 k8s 分配到了哪一台机器上

kubectl get pods --all-namespaces -o wide

查看 dashboard 的集群内部 IP

kubectl get services --all-namespaces

image

curl http://127.0.0.1:8080

image

查看 pod 的状态

kubectl get pods --namespace=kube-system

扩容/缩容

在生产环境下,在面临服务需要扩容的场景时,可以使用 Deployment/RC 的 Scale 机制来实现。
Kubernetes 支持对 Pod 的手动扩容和自动扩容

扩容

kubectl  scale deployment nginx-deployment --replicas=4

image

缩容

kubectl  scale deployment nginx-deployment --replicas=2

结语

kubeadm 部署 kubernetes 相比其他工具简单了不少,大概花费 2 小时之内就能部署成功.

另外今年把学习 k8s 加入了学习清单中,推荐在极客时间上学习 k8s 的一门课"深入剖析 kubernetes"

参考

解决 Centos7 下 Kubernetes(k8s) 部署好之后无法访问 dashboard
https://blog.csdn.net/fei79534672/article/details/78710858

kubernetes 浏览器访问 kube-apiserver 安全端口

https://www.orchome.com/1204

kubernetes-dashboard(1.8.3) 部署与踩坑

https://www.cnblogs.com/RainingNight/p/deploying-k8s-dashboard-ui.html

kubeadm 部署 kubernetes1.14

https://www.cnblogs.com/tchua/p/10897980.html

Kubernetes Handbook——Kubernetes 中文指南/云原生应用架构实践手册

https://jimmysong.io/kubernetes-handbook/

安装 dashboard 插件

https://jimmysong.io/kubernetes-handbook/practice/dashboard-addon-installation.html

k8s 容器,并供外部访问

https://blog.csdn.net/myth_g/article/details/85128716

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册