搭建kubernete集群

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值

注意格式:

拷贝到桌面

登录:

验证:



原文地址:https://www.cnblogs.com/lummg-DAY/p/12622967.html