kubernetes 部署过程:
1、基础环境准备 2、部署 harbor 及 haproxy 高可用反向代理 3、在所有 master 安装指定版本的 kubeadm 、kubelet、kubectl、docker 4、在所有 node 节点安装指定版本的 kubeadm 、kubelet、docker,在 node 节点 kubectl 为 可选安装,看是否需要在 node 执行 kubectl 命令进行集群管理及 pod 管理等操作。 5、master 节点运行 kubeadm init 初始化命令 6、验证 master 节点状态 7、在 node 节点使用 kubeadm 命令将自己加入 k8s master(需要使用 master 生成 token 认 证) 8、验证 node 节点状态 9、创建 pod 并测试网络通信 10、部署 web 服务 Dashboard 11、k8s 集群升级
一、基础环境准备
1.1 各节点时间同步
ntpdate ntp1.aliyun.com
1.2 修改主机名
192.168.134.101 master 192.168.134.102 node01 192.168.134.91 harbo.linux.com
二、 部署 harbor 及 haproxy 高可用反向代理
2.1 创建harbor仓库
使用软件:harbor-offline-installer-v1.7.6.tgz
apt install docker-compose -y docker-install.sh tar xvf harbor-offline-installer-v1.7.6.tgz vim harbor.cfg hostname = harbo.linux.com harbor_admin_password = 123456 . install.sh window上添加域名 192.168.134.91 harbo.linux.com
2.2 配置keepalived
VIP:192.168.134.99
添加:net.ipv4.ip_forward=1
apt install keepalived cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf virtual_ipaddress { 192.168.134.99 dev eth0 label eth0:1 }
2.3 配置haproxy
listen k8s-api-6443 bind 192.168.134.99:6443 mode tcp balance roundrobin server master1 192.168.134.101:6443 check inter 3s fall 3 rise 5 server master2 192.168.134.102:6443 check inter 3s fall 3 rise 5
三、安装k8s各组件
3.1 安装docker19.03版
#!/bin/bash # step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 写入软件源信息 sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安装Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce docker-ce-cli
3.2 master节点安装镜像加速器
# sudo mkdir -p /etc/docker # sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["xxx"] } EOF # sudo systemctl daemon-reload && sudo systemctl restart docker
3.3 所有节点安装 kubelet kubeadm kubectl
所有节点配置阿里云仓库地址并安装相关组件,node 节点可选安装 kubectl
https://developer.aliyun.com/mirror/kubernetes
apt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl
root@ubuntu:~# apt-cache madison kubeadm
kubeadm | 1.17.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
master节点
apt install kubeadm=1.17.3-00 kubectl=1.17.3-00 kubelet=1.17.3-00
node节点
apt install kubeadm=1.17.2-00 kubelet=1.17.2-00 -y
3.4 master 节点运行 kubeadm init 初始化命令:
https://k8smeetup.github.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow
在两台 master 中任意一台 master 进行集群初始化,而且集群初始化只需要初始化一次。
3.4.1 kubeadm 命令使用
Available Commands: alpha #kubeadm 处于测试阶段的命令 completion #bash 命令补全,需要安装 bash-completion #mkdir /data/scripts -p #kubeadm completion bash > /data/scripts/kubeadm_completion.sh #source /data/scripts/kubeadm_completion.sh #vim /etc/profile source /data/scripts/kubeadm_completion.sh config #管理 kubeadm 集群的配置,该配置保留在集群的 ConfigMap 中 #kubeadm config print init-defaults help Help about any command init #启动一个 Kubernetes 主节点 join #将节点加入到已经存在的 k8s master reset 还原使用 kubeadm init 或者 kubeadm join 对系统产生的环境变化
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
3.4.1.1:kubeadm init 命令简介
命令使用: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
集群初始化: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/
--apiserver-advertise-address string #K8S API Server 将要监听的监听的本机 IP --apiserver-bind-port int32 #API Server 绑定的端口,默认为 6443 --control-plane-endpoint string #为控制平台指定一个稳定的 IP 地址或 DNS 名称,即配置一个可以长期使用切是高可用的 VIP 或者域名,k8s多master高可用基于此参数实现 --ignore-preflight-errors strings #可以忽略检查过程 中出现的错误信息,比如忽略 swap,如 果为 all 就忽略所有 --image-repository string #设置一个镜像仓库,默认为 k8s.gcr.io --kubernetes-version string #指定安装 k8s 版本,默认为 stable-1 --pod-network-cidr #设置 pod ip 地址范围 -service-cidr #设置 service 网络地址范围 --service-dns-domain string #设置 k8s 内部域名,默认为 cluster.local,会有相应的 DNS 服务 (kube-dns/coredns)解析生成的域名记录
3.4.1.2:验证当前 kubeadm 版本和查看安装指定版本 k8s 需要的镜像有哪些
1、pause镜像:封装底层网络接口
3.4.1.3:master 节点镜像下载
提前在 master 节点下载镜像以减少安装等待时间,但是镜像默认使用 Google 的镜像仓 库,所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来,可以 避免后期因镜像下载异常而导致 k8s 部署异常。
阿里云下载:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.2 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
上传至harbor
root@node01:~# docker login harbo.linux.com Username: Password: 错误: Error response from daemon: Get https://harbo.linux.com/v2/: dial tcp 192.168.134.91:443: connect: connection refused 解决: vim /lib/systemd/system/docker.service 最后添加:--insecure-registry harbo.linux.com ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry harbo.linux.com
systemctl daemon-reload
systemctl restart docker.service
为要上传的镜像打标签:(举一例说明) docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3 harbo.linux.com/kube-proxy/registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3 上传镜像: docker push harbo.linux.com/kube-proxy/registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3
验证:
3.4.1.3: 基于命令初始化高可用 master 方式:
kubeadm init --apiserver-advertise-address=192.168.134.101 --apiserver-bind-port=6443 --control-plane-endpoint=192.168.134.99 --kubernetes-version=v1.17.2 --pod-network-cidr=10.10.0.0/16 --service-cidr=192.168.1.0/24 --service-dns-domain=linux39.local --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors='swap'
可能会报错:
1、错误一:不要使用swap空间 解决:可以执行swapoff -a
Apr 03 15:40:36 ubuntu kubelet[3829]: F0403 15:40:36.071382 3829 server.go:273] failed to run Kubelet: running with swap on is not supported, please disable swap! or se
t --fail-swap-on flag to false. /proc/swaps contained: [Filename Type Size Used Priority /swapfile
file 969960 0 -2]2、错误二:k8s的cgroups要和docker的cgroups一致。 修改kubelet的Cgroup Driver 修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,增加--cgroup-driver=cgroupfs
基于命令初始化高可用 master :
基于文件初始化高可用 master 方式
kubeadm init --config kubeadm-init.yaml #基于文件执行 k8s master 初始化
kubeadm config print init-defaults > kubeadm-init.yaml #将默认配置输出至文件 cat kubeadm-init.yaml #修改后的初始化文件内容 apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 48h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.134.102 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: node01 taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controlPlaneEndpoint: 192.168.134.99:6443 controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.17.3 networking: dnsDomain: linux39.local podSubnet: 10.10.0.0/16 serviceSubnet: 172.26.0.0/16 scheduler: {}
3.5:配置 kube-config 文件及网络组件:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config root@ubuntu:~# kubectl get node NAME STATUS ROLES AGE VERSION ubuntu NotReady master 53m v1.17.2
3.6:当前 maste 生成证书用于添加新控制节点:
root@ubuntu:~# kubeadm init phase upload-certs --upload-certs I0403 16:44:56.976407 21872 version.go:251] remote version is much newer: v1.18.0; falling back to: stable-1.17 W0403 16:44:58.386471 21872 validation.go:28] Cannot validate kube-proxy config - no validator is available W0403 16:44:58.386489 21872 validation.go:28] Cannot validate kubelet config - no validator is available [upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace [upload-certs] Using certificate key: 74f9db7d8ffe40d3ebdbca56d273a87f67bbb7cefdc527c3c2d0ebfa11363de8
3.7:添加新 master 节点: 在另外一台已经安装了 docker、kubeadm 和 kubelet 的 master 节点上执行以下操作:
kubeadm join 192.168.134.99:6443 --token 659w5i.7plbutnu2qy6gf5y --discovery-token-ca-cert-hash sha256:ee06ed5b181b48959e92a1f9695aba069809f853811ae95f016f9c580a2f6362 --control-plane --certificate-key 7eb5e12be5f40b126260437e768f09a6073e32ea5765b0d11ddeb97ceedf5362
验证:
状态:NotReady
3.8 :配置 kube-config 文件及网络组件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml vim kube-flannel.yml net-conf.json: | { "Network": "10.10.0.0/16", #pod网段,关系到容器是否可以对外访问 "Backend": { "Type": "vxlan" } kubectl apply -f kube-flannel.yml
验证
集群状态:
3.9:k8s 集群添加 node 节点
kubeadm join 192.168.134.99:6443 --token pafcb1.xa5o5fg2t1ibg916 > --discovery-token-ca-cert-hash sha256:19cfd26a5ef68eaa620c1da18793c88ec5ac49b9b899a25ad1363d622192dd87
验证
节点服务类型:
master节点: coredns、etcd、kube-apiserver、kube-controller、kube-scheduler、kube-flannel、kube-proxy
node节点:kube-flannel、kube-proxy
查看service:
3.10:k8s 创建容器并测试网络:
分别在node02、ubuntu创建
验证网络:
如果出问题:可能是两处配置问题
1、检查宿主机路由转发功能
net.ipv4.ip_forward = 1
2、检查flannel.yml文件:网络组件flannel的配置文件中的 net-conf.json:Network值是否为pod的地址段
kubectl delete -f kube-flannel.yml
修改kube-flannel.yml之后:
kubectl apply -f kube-flannel.yml
pod解析问题:
查看:初始化文件中DNScore的配置问题。如果没问题,就删除coredns容器,它会重建。
kubectl delete pod coredns-7f9c544f75-6rs9s -n kube-system
验证:
3.11:部署 web 服务 dashboard
https://github.com/kubernetes/dashboard
3.11.1:下载相关镜像和上传至harbor
docker pull kubernetesui/dashboard:v2.0.0-rc6 (id=cdc71b5a8a0e) docker tag cdc71b5a8a0e harbo.linux.com/base-image/dashboard:v2.0.0-rc6 docker push harbo.linux.com/base-image/dashboard:v2.0.0-rc6 docker pull kubernetesui/metrics-scraper:v1.0.3 docker tag docker.io/kubernetesui/metrics-scraper:v1.0.3 harbo.linux.com/base-image/metrics-scraper:v1.0.3 docker push harbo.linux.com/base-image/metrics-scraper:v1.0.3
3.11.2:修改相关的配置文件
vim dashboard-2.0.0-rc6.yml spec: containers: - name: kubernetes-dashboard image: harbo.linux.com/base-image/dashboard:v2.0.0-rc6 #harbor镜像地址 containers: - name: dashboard-metrics-scraper image: harbo.linux.com/base-image/metrics-scraper:v1.0.3 #harbor镜像地址 vim admin-user.yml 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
kubectl apply -f dashboard-2.0.0-rc6.yml
kubectl apply -f admin-user.yml
验证:
TYPE:NodePort的端口。每个node节点都监听
3.12:登陆方式
3.12.1:获取登录 token
3.12.1:kubeconfig方式
root@node01:~# cp /root/.kube/config /opt/kubeconfig root@node01:~# vim /opt/kubeconfig
在/opt/kubeconfig中
- name: kubernetes-admin
user:
..........................省略.......................
token: 省略 #添加token值
注意格式:
拷贝到桌面
登录:
验证: