第一部分 安装Docker
参考链接:https://juejin.im/post/5c36fd906fb9a049f8197c9b#heading-3
1.1 安装Docker
yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce
systemctl enable docker
systemctl start docker
1.2 Docker镜像加速和Container runtimes
参考链接:https://www.cnblogs.com/happy4java/p/11206839.html 和 https://kubernetes.io/docs/setup/production-environment/container-runtimes/
在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
重启docker服务
systemctl daemon-reload
systemctl restart docker
第二部分 安装kubeadm
参考链接:https://juejin.im/post/5c36fd906fb9a049f8197c9b#heading-3
2.1 配置阿里云的源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
2.2 重建Yum缓存
yum -y install epel-release
yum clean all
yum makecache
2.3 安装并启动kubeadm
yum -y install kubelet kubeadm kubectl kubernetes-cni
systemctl enable kubelet && systemctl start kubelet
第三部分 关防火墙、关掉SWAP、关SElinux
参考链接:https://juejin.im/post/5c36fd906fb9a049f8197c9b#heading-3
1. 关掉所有主机上的防火墙, 并禁止防火墙自启动
systemctl stop firewalld
systemctl disable firewalld
- 或者通过这个链接查找需要暴露的端口:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E6%8E%A7%E5%88%B6%E5%B9%B3%E9%9D%A2%E8%8A%82%E7%82%B9
具体输入什么命令可以暴露端口自己百度吧。
2. 关掉swap
- 临时禁用
sudo swapoff -a
- 永久禁用,打开/etc/fstab注释掉swap那一行。
3. 关闭 SELinux
- 临时禁用selinux
setenforce 0
- 永久关闭:修改/etc/sysconfig/selinux文件, 设置SELINUX=disabled
4. 配置转发参数
- 配置转发相关参数,否则可能会出错
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.all.forwarding = 1
vm.swappiness = 0
EOF
- 使配置生效,查看输出中的相关参数是否被其它文件覆盖
sysctl --system
- 为防止被覆盖,可执行下面的命令
sysctl -p /etc/sysctl.d/k8s.conf
第四部分 下载镜像
如果已经翻墙了,并且速度非常快,这一步可以不做。后面初始化kubeadm会自动下载。
否则,由于kubeadm要下载的镜像需要翻墙,必须提前下载好。
4.1 查看要下载的镜像
kubeadm config images list
运行结果:
k8s.gcr.io/kube-apiserver:v1.18.6
k8s.gcr.io/kube-controller-manager:v1.18.6
k8s.gcr.io/kube-scheduler:v1.18.6
k8s.gcr.io/kube-proxy:v1.18.6
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
4.2 下载
docker pull kubesphere/kube-apiserver:v1.18.6
docker pull kubesphere/kube-controller-manager:v1.18.6
docker pull kubesphere/kube-scheduler:v1.18.6
docker pull kubesphere/kube-proxy:v1.18.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull coredns/coredns:1.6.7
4.3 修改Tag
docker tag kubesphere/kube-apiserver:v1.18.6 k8s.gcr.io/kube-apiserver:v1.18.6
docker tag kubesphere/kube-controller-manager:v1.18.6 k8s.gcr.io/kube-controller-manager:v1.18.6
docker tag kubesphere/kube-scheduler:v1.18.6 k8s.gcr.io/kube-scheduler:v1.18.6
docker tag kubesphere/kube-proxy:v1.18.6 k8s.gcr.io/kube-proxy:v1.18.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 k8s.gcr.io/etcd:3.4.3-0
docker tag coredns/coredns:1.6.7 k8s.gcr.io/coredns:1.6.7
第五部分 初始化kubeadm
5.1 初始化
kubeadm init
记录下最后一部分,用于加入slave节点
kubeadm join 192.168.122.77:6443 --token .............
5.2 如果后面遇到问题可以重置kubeadm
kubeadm reset
第六部分 配置kubectl认证信息
6.1 要想让kubectl在非root用户上也能工作, 运行以下命令, 也属于 kubeadm init
的输出之一:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.2 或者, 如果想以root身份运行
- 临时生效
export KUBECONFIG=/etc/kubernetes/admin.conf
- 永久生效
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
第七部分 添加网络插件
7.1 添加weave插件
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
7.2 查看安装状态
kubectl get pods -n kube-system
在安装网络插件之前,coredns也是不能运行的,添加weave插件之后一段时间就都能正常工作了。
第八部分 安装Dashboard UI
8.1 修改Host
参考链接:https://www.cnblogs.com/huangzs/p/12765284.html
因为后面一部的yaml文件放在raw.githubusercontent.com了,被墙了,所以照上面的链接做就行了。
修改hosts Ubuntu,CentOS及macOS直接在终端输入
sudo vi /etc/hosts
添加以下内容保存即可 (IP地址查询后相应修改,可以ping不同IP的延时 选择最佳IP地址)
# GitHub Start
52.74.223.119 github.com
192.30.253.119 gist.github.com
54.169.195.247 api.github.com
185.199.111.153 assets-cdn.github.com
151.101.76.133 raw.githubusercontent.com
151.101.108.133 user-images.githubusercontent.com
151.101.76.133 gist.githubusercontent.com
151.101.76.133 cloud.githubusercontent.com
151.101.76.133 camo.githubusercontent.com
151.101.76.133 avatars0.githubusercontent.com
151.101.76.133 avatars1.githubusercontent.com
151.101.76.133 avatars2.githubusercontent.com
151.101.76.133 avatars3.githubusercontent.com
151.101.76.133 avatars4.githubusercontent.com
151.101.76.133 avatars5.githubusercontent.com
151.101.76.133 avatars6.githubusercontent.com
151.101.76.133 avatars7.githubusercontent.com
151.101.76.133 avatars8.githubusercontent.com
# GitHub End
如果上面的ip地址失效了,请参考原链接重新查询IP地址。
8.2 安装metrics-server
参考链接: https://github.com/kubernetes-sigs/metrics-server
(1) 下载镜像
docker pull kubesphere/metrics-server:v0.3.7
docker tag kubesphere/metrics-server:v0.3.7 k8s.gcr.io/metrics-server/metrics-server:v0.3.7
(2) 下载metrics-server yaml文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml -O metrics-server.yaml
(3) 在第90行附近添加两行
containers:
- name: metrics-server
image: k8s.gcr.io/metrics-server-amd64:v0.3.6
imagePullPolicy: IfNotPresent
args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-insecure-tls # 添加
- --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname # 添加
(4) 安装
kubectl apply -f metrics-server.yaml # 安装
kubectl delete -f metrics-server.yaml # 删除
(5) 测试
kubectl top node
8.3 部署Dashboard UI
参考链接:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
写出参考链接就是怕里面的版本号更新不能用了,请注意查看原链接的版本号。
8.4 暴露Dashboard所用的端口
参考链接:https://blog.csdn.net/networken/article/details/85607593
30443是浏览器访问的端口。
kubectl patch svc kubernetes-dashboard -n kubernetes-dashboard \
-p '{"spec":{"type":"NodePort","ports":[{"port":443,"targetPort":8443,"nodePort":30443}]}}'
8.5 创建登录用户
参考链接同上。
创建yaml文件:
cat > dashboard-adminuser.yaml << EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
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
EOF
创建用户:
kubectl apply -f dashboard-adminuser.yaml
8.6 查看新建的admin-user的token并复制下来
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
8.7 打开浏览器,进入https://localhost:30443
粘贴token登录。
第九部分 添加和删除节点
1. 添加节点
在其他主机上运行第5.1节kubeadm init输出的命令。
其他主机必须做好本文的前4部分内容才能顺利加入。
如果加入失败,可以在kubeadm join命令后加入 --v=2 输出详细信息
2. 删除节点
参考链接:https://blog.csdn.net/fanren224/article/details/86610799
主节点:
kubectl get node # 查看Node
kubectl drain NODE_NAME --delete-local-data --force --ignore-daemonsets
kubectl delete node NODE_NAME
被删除节点:
kubeadm reset
附录 一些重置命令
上面的步骤估计不太可能顺利地运行完,肯定会遇到各种问题。下面是一些重置命令,备用:
重启docker 服务
systemctl daemon-reload
systemctl restart docker
如果kubeadm join出现问题可以尝试重启kubelet:
systemctl daemon-reload
systemctl restart kubelet
docker 删除所有image (加上-f参数可以强制删除)
docker rmi $(docker images -q)
docker rmi IMAGE_ID
查看Kubernetes的各种资源(比如Pod、Service、Secret等)的输出
kubectl -n kubernetes-dashboard describe pod POD_NAME
删除 Dashboard
kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
查看服务的启动日志(以docker为例)
systemctl status docker.service
查看系统日志
vi /var/log/syslog
查看指定服务的日志
grep "bx" /var/log/syslog
查看systemctl启动日志
journalctl -f
# 或者
journalctl -xe
删除master节点的污点
kubectl taint node -l node-role.kubernetes.io/master node-role.kubernetes.io/master:NoSchedule-