早上起来你有两个选择:
盖上被子做你未完成的梦||掀开被子完成未完成的梦

K8S学习–Kubeadm 安装 kubernetes-2-安装部署

K8S学习–Kubeadm-1-组件简介

安装方式

部署 工具

使用批量 部署工具如 (ansible/ saltstack) 、 手动二进制 (很熟悉的时候可以尝试部署)、 kubeadm 、 apt-get /yum 等方式安装,以守护进程的方式 启动 在宿主机上,类似于是 N ginx 一样 使用 service 脚本启动。

kubeadm

https://github.com/kubernetes/kubeadm #github中的kubeadm

Kubeadm是一种工具,旨在为创建Kubernetes集群提供最佳实践的“快速路径”。它以用户友好的方式执行必要的操作,以使最低限度的可行,安全的群集启动并运行。Kubeadm的范围仅限于本地节点文件系统和Kubernetes API,它旨在成为高级工具的可组合构建块。

https://kubernetes.io/zh/docs/setup/independent/create-cluster-kubeadm/ # beta阶段
使用k8s 官方提供的部署工具 kubeadm 自动安装, 需要在 master 和 node 节点上安装 docker等组件,然后初始化,把管理端的控制服务和node上的服务都以 pod 的 方式运行 。

https://github.com/easzlab/kubeasz #ansible部署K8S

kubeadm 介绍

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/

V1.10版本 kubeadm 介绍:
https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md

安装注意事项:

注意:
禁用 swap selinux iptables

# ufw status
Status: inactive

# getenforce
Disabled

# swapoff -a  临时关闭
free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        149M        1.4G        9.0M        349M        1.6G
Swap:            0B          0B          0B  #swap的大小为0

# vim /etc/fstab 
#/swapfile                                 none            swap    sw              0       0
注释/swapfile文件

kubernetes 部署过程

具体步骤:
当前部署版本为当前次新版本, 因为后面需要 使用 kubeadm 做 kubernetes 版本升级演示 。
目前官方最新版本为 1 .17.4 因此本次先以 1 .17.2版本 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 服务 D ashboard
1 1 、 k8s 集群升级

基础环境准备

服务器环境最小化安装基础系统,并关闭防火墙 selinux 和 swap ,更新软件源、时间同步、安装常用命令 ,重启后验证基础配置。

#apt-get update & apt-get upgrade -y

#ntpdate ntp1.aliyun.com

# cat /etc/security/limits.conf|grep -v ^#
root soft core unlimited
root hard core unlimited
root soft nproc 1000000
root hard nproc 1000000
root soft nofile 1000000
root hard nofile 1000000
root soft memlock 32000
root hard memlock 32000
root soft msgqueue 8192000
root hard msgqueue 8192000
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000

# cat /etc/sysctl.conf|grep -v ^#
net.ipv4.conf.default.rp_filter = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1  #这个参数一定要开
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 20480
net.core.optmem_max = 81920
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 10001 65000
vm.overcommit_memory = 0
vm.swappiness = 10

#sysctl -a #查看内核参数
#sysctl -p
角色 主机名 IP地址
k8s-master1 master1 172.20.10.100
k8s-master2 master2 172.20.10.101
k8s-master3 master3 172.20.10.102
k8s-HA-1 HA-server1 172.20.10.22
k8s-HA-2 HA-server2 172.20.10.44
k8s- harbor Harbor 172.20.10.33
k8s- node1 Node-1 172.20.10.200
k8s- node2 Node-2 172.20.10.201
k8s- node3 Node-3 172.20.10.202

harbor 及反向代理

安装docker相关工具以及服务

root@Harbor:/usr/local/src# cat docker-install.sh
#!/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

安装docker-compose

root@Harbor:/usr/local/src# apt install docker-compose -y

拖入harbor-offline-installer-v1.7.6文件
在这里插入图片描述

root@Harbor:/usr/local/src# tar xvf harbor-offline-installer-v1.7.6.tgz
root@Harbor:/usr/local/src# cd harbor/
root@Harbor:/usr/local/src/harbor# vim harbor.cfg
8行 hostname = harbor.linux39.com   #修改hostname  到时候直接把这个域名解析为一个A记录本机的地址172.20.10.33
再把master和node节点的DNS指向公司内网DNS即可
69行 harbor_admin_password = 123456  #修改harbor的密码

安装harbor

root@Harbor:/usr/local/src/harbor# pwd
/usr/local/src/harbor
root@Harbor:/usr/local/src/harbor# ./install.sh
。。。。。。

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://harbor.linux39.com. 
For more details, please visit https://github.com/goharbor/harbor .

。/

访问失败因为宿主机没有harbor.linux39.com的本地DNS解析
在window宿主机上做一个本地DNS解析:

#C:\Windows\System32\drivers\etc\hosts
172.20.10.33 harbor.linux39.com  #新增本地DNS解析

web访问harbor:
在这里插入图片描述

keepalived配置

在全部的HA-server服务器上安装 haproxy keepalived

root@HA-server:~# apt install haproxy keepalived -y

找到配置文件模板拷贝到配置目录

root@HA-server1:~# find / -name keepalived.con* #寻找配置文件模板文件

root@HA-server1:~# cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf 

root@HA-server1:~# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    garp_master_delay 10
    smtp_alert
    virtual_router_id 56   #修改任意数字 不冲突即可
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.20.10.248 dev eth0 label eth0:1  # 172.20.10.248这个IP来做VIP
    }
}

重启keepalived

root@HA-server1:~# systemctl restart keepalived

检测是否成功

root@HA-server1:~# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.10.22  netmask 255.255.0.0  broadcast 172.20.255.255
        inet6 fe80::20c:29ff:fe4b:c467  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:4b:c4:67  txqueuelen 1000  (Ethernet)
        RX packets 3622  bytes 3634058 (3.6 MB)
        RX errors 4  dropped 0  overruns 0  frame 0
        TX packets 2676  bytes 225893 (225.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 19  base 0x2000  

eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.10.248  netmask 255.255.255.255  broadcast 0.0.0.0  #表示已经成功起来
        ether 00:0c:29:4b:c4:67  txqueuelen 1000  (Ethernet)
        device interrupt 19  base 0x2000 

Haproxy配置

root@HA-server1:~# vim /etc/haproxy/haproxy.cfg #在最后新增一个监听地址
listen k8s-api-6443
  bind 172.20.10.248:6443  #绑定的VIP地址
  mode tcp      #这个模式是tcp 走http通不了
  server master1 172.20.10.100:6443 check inter 3s fall 3 rise 5
  server master2 172.20.10.101:6443 check inter 3s fall 3 rise 5
  server master3 172.20.10.102:6443 check inter 3s fall 3 rise 5

重启以及查看是否监听 172.20.10.248:6443 地址

root@HA-server1:~# systemctl restart haproxy
root@HA-server1:~# ss -ntl
State         Recv-Q         Send-Q                  Local Address:Port                  Peer Address:Port         
LISTEN        0              2000                    172.20.10.248:6443                       0.0.0.0:*            
LISTEN        0              128                     127.0.0.53%lo:53                         0.0.0.0:*            
LISTEN        0              128                           0.0.0.0:22                         0.0.0.0:*            
LISTEN        0              128                         127.0.0.1:6010                       0.0.0.0:*            
LISTEN        0              128                              [::]:22                            [::]:*            
LISTEN        0              128                             [::1]:6010                          [::]:*  

安装 kubeadm 等组件

在master 和 node 节点安装 kubeadm 、 kubelet 、 kubectl 、 docker 等软件。
必须选用k8s兼容的版本.这一点非常的重要

https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.17.md#downloads-for-v1174
安装经过验证的 docker 版本

https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b1100kEM2
阿里云镜像k8s安装参考

https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11IB0fL1
安装docker-ce参考

在这一步全部master节点以及全部的node节点都要安装docker 这里只用master-1来做演示

root@master-1:~# vim docker-install.sh 
root@master-1:~# cat docker-install.sh
#!/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 #没有增加版本号 默认安装最新版本
root@master-1:~# bash docker-install.sh
root@master-1:~# docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40

master 节点 配置 docker 加速器

只需要在一个master节点上配置即可

root@master-1:~# sudo mkdir -p /etc/docker
root@master-1:~# sudo tee /etc/docker/daemon.json <<-'EOF'
> {
>     "registry-mirrors": ["https://9916w1ow.mirror.aliyuncs.com"]
> }
> EOF

root@master-1:~# systemctl daemon-reload
root@master-1:~# systemctl restart docker

所有节点安装 kubelet kubeadm kubectl

所有节点配置阿里云仓库地址并安装相关组件 node 节点可选安装 kubectl

镜像仓库配置

https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11JXALy6
配置阿里云镜像的 kubernetes 源 用于安装 kubelet kubeadm kubectl 命令

在这里插入图片描述

这个在每一个master节点以及node节点都需要安装的命令

# 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  #最后的EOF需要手动输入

# apt-get update

# apt-cache madison kubeadm #查看是否有对应的版本 URL为aliyun 如果看不到则前面配置没有成功

在全部master上面安装,这里只用master1来做演示:

root@master-1:~# apt install  kubeadm=1.17.2-00 kubectl=1.17.2-00 kubelet=1.17.2-00 -y

在这里插入图片描述

在全部node上面安装,这里只用Node-1来做演示:这里注意可以不用安装kubectl 。这样管理的话只能在master上执行

root@Node-1:~# apt install  kubeadm=1.17.2-00  kubelet=1.17.2-00 -y

上面三个当中只有kubelet是一个服务 其他两个kubeadm kubectl只是命令

验证 master 节点 kubelet 服务

目前启动kubelet 以下报错:

root@master-1:~# cat /var/log/syslog

Mar 28 23:10:47 master-1 systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Mar 28 23:10:47 master-1 systemd[1]: kubelet.service: Failed with result 'exit-code'.
Mar 28 23:10:57 master-1 systemd[1]: kubelet.service: Service hold-off time over, scheduling restart.
Mar 28 23:10:57 master-1 systemd[1]: kubelet.service: Scheduled restart job, restart counter is at 227.
Mar 28 23:10:57 master-1 systemd[1]: Stopped kubelet: The Kubernetes Node Agent.
Mar 28 23:10:57 master-1 systemd[1]: Started kubelet: The Kubernetes Node Agent.
Mar 28 23:10:57 master-1 kubelet[13996]: F0328 23:10:57.957716   13996 server.go:198] failed to load Kubelet
 config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", 
 error: open /var/lib/kubelet/config.yaml: no such file or directory
#找不到/var/lib/kubelet/config.yaml文件 因为现在还没有配置
Mar 28 23:10:57 master-1 systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Mar 28 23:10:57 master-1 systemd[1]: kubelet.service: Failed with result 'exit-code'.

master 节点运行 kubeadm init 初始化命令

在三台master 中任意一台 master 进行集群初始化 ,而且集群初始化只需要初始化一次。

kubeadm 命令使用

https://github.com/kubernetes/kubeadm/issues#kubeadm项目

root@master-1:~# kubeadm --help #查看帮助

Available Commands:
  alpha       Kubeadm experimental sub-commands
  completion  Output shell completion code for the specified shell (bash or zsh)
  config      Manage configuration for a kubeadm cluster persisted in a ConfigMap in the cluster
  help        Help about any command
  init        Run this command in order to set up the Kubernetes control plane
  join        Run this on any machine you wish to join an existing cluster
  reset       Performs a best effort revert of changes made to this host by 'kubeadm init' or 'kubeadm join'
  token       Manage bootstrap tokens
  upgrade     Upgrade your cluster smoothly to a newer version with this command
  version     Print the version of kubeadm
Available Commands:
alpha      #kubeadm 处于测试阶段的命令

completion #bash 命令补全,需要安装 bash completion
#安装方法:
#mkdir /data/scripts -p
#kubeadm completion bash > /data/scripts/kubeadm_completion.sh
# chmod a+x /data/scripts/kubeadm_completion.sh #给脚本加一个执行权限
#source /data/scripts/kubeadm_completion.sh #当前临时生效
#vim /etc/profile  #开机自启生效
source /data/scripts/kubeadm_completion.sh
# source /etc/profile

config   # 管理 kubeadm 集群的配置,该配置保留在集群的ConfigMap中
         #kubeadm config print init defaults  #打印出安装方式
help     #Help about any command
init     # 启动一个 Kub ernetes 主节点
join     # 将节点加入到已经存在的 k8s master
reset     #还原使用 kubeadm init 或者 kubeadm join 对系统产生的环境变化 /使用慎重
token    # 管理 token
upgrade  # 升级 k8s 版本
version  # 查看版本信息
root@master-1:~# kubeadm config print init-defaults  #默认的安装文件,可以重定向为.yml格式进行编辑修改
W0328 23:28:41.498919   17009 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0328 23:28:41.499014   17009 validation.go:28] Cannot validate kubelet config - no validator is available
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master-1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.17.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}

kubeadm init 命令简介

命令 使用:
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/

Kubeadm 是一个工具,它提供了 kubeadm init 以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践。

kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是准备节点环境的工作。同样的,诸如安装各种各样的可有可无的插件,例如 Kubernetes 控制面板、监控解决方案以及特定云提供商的插件,这些都不在它负责的范围。相反,我们期望由一个基于 kubeadm 从更高层设计的更加合适的工具来做这些事情;并且,理想情况下,使用 kubeadm 作为所有部署的基础将会使得创建一个符合期望的集群变得容易

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init/ #集群初始化

root@master-1:~# kubeadm init --help

可指定:--apiserver-advertise-address string # K8S API Server 将要监听的监听的 本机 IP
可指定:--apiserver-bind-port int32 #API Server 绑定的端口 默认为 6443

不用指定:--apiserver-cert-extra-sans string # 可选的证书额外信息,用于指定 API Server 的服务器证书。可以是 IP 地址也可以是 DNS 名称。
不用指定:--cert-dir string # 证书的存储路径,缺省路径为 /etc/kubernetes/pki
不用指定:--certificate-key string #定义一个 用于加密 kubeadm certs Secret 中的 控制平台 证书的密钥
不用指定:--config string #kubeadm 配置文件的路径

集群配置指定:--control-plane-endpoint string #为控制平台指定一个稳定的 IP 地址或 DNS 名称,即配置一个可以长期使用切是
高可用的 VIP 或者域名, k8s多 master 高可用基于此参数实现 一般就是稳定的VIP地址:6443 让它进行调度

不用指定:--cri-socket-string # 要连接的 CRI 容器运行时接口 C ontainer Runtime Interface, 简称 CRI 套接字的路径,
如果为空,则 kubeadm 将尝试自动检测此值, 仅当安装了多个 CRI 或具有非标准 CRI 插槽时,才使用此选项
不用指定:--dry-run  #不要应用任何更改, 只是输出将要执行的操作 ,其实就是测试运行 。
不用指定:--experimental-ustomize string # 用于存储 kustomize 为静态 pod 清单所提供的补丁的路径。
不用指定:--feature-gates string #一组用来描述各种功能特性的键值( key=value )对,选项是IPv6DualStack=true|false (ALPHA default=false)
可指定:--ignore preflight-errors strings #可以忽略检查过程 中出现的错误信息,比如忽略 swap ,如果为 all 就忽略所有
可指定:--image-repository string #设置一个镜像仓库,默认为 k8s.gcr.io
可指定:--kubernetes-version string #指定安装 k8s 版本,默认为 stable-1(次新版本)
不用指定:--node-name string # 指定node节点名称 保证k8s里面节点名称都不一样
可指定:--pod-network cidr # 设置 pod ip 地址范围  保证容器的网络地址段和其他网络都不要冲突
可指定:--service cidr # 设置 service 网络地址范围 service网络生产中很少 基本一个服务就是一个service 
可指定:--service-dns-domain string # 设置 k8s 内部域名,默认为 cluster.local 会有相应的k8s内部的DNS服务
kube dns/coredns 解析生成的域名记录。一般改为公司内部的域名后缀 
不用指定:--skip -ertificate-key-print # 不打印用于加密的 key 信息
不用指定:--skip-phases strings # 要跳过哪些阶段
不用指定:--skip-token-print # 跳过打印 token 信息
不用指定:--token # 指定 token 会给一个默认的token 
不用指定:--token-ttl # 指定 token 过期时间,默认为 24 小时, 0 为永不过期
不用指定:--upload-certs # 更新证书

全局可选项:
不用指定:--add-dir-header 如果为 true 在日志头部添加日志目录
不用指定:--log-file string # 如果不为空,将使用此日志 文件
不用指定:--log-file-max-size uint # 设置日志文件的最大大小,单位为兆,默认为 1800 兆 0 为没有限制
不用指定:--rootfs # 宿主机的根路径,也就是 绝对路径
不用指定:--skip-headers #如果 为 true ,在 log 日志里面不显示 标题前缀
不用指定:--skip-log-headers # 如果 为 true ,在 log 日志里里不显示标题

验证 当前 kubeadm 版本:

root@master-1:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", 
GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:27:49Z", 
GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}

准备镜像

查看安装指定版本 k8s 需要的镜像有哪些

root@master-1:~# kubeadm config images list --kubernetes-version v1.17.2
k8s.gcr.io/kube-apiserver:v1.17.2
k8s.gcr.io/kube-controller-manager:v1.17.2
k8s.gcr.io/kube-scheduler:v1.17.2
k8s.gcr.io/kube-proxy:v1.17.2
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

master 节点 镜像 下载:

推荐提前 在 master 节点 下载 镜像以减少安装等待时间 但是镜像默认使用 Google 的镜像仓库 所以 国内无法直接下载,但是可以通过阿里云的镜像 仓库 把镜像先提前下载下来 ,可以避免 后期 因镜像 下载 异常而导致 k8s 部署 异常。因为初始化的时候有一个默认的超时时长 超过超时时长初始化失败

# cat images-download.sh
#!/bin/bash
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
# bash images download.sh

查看是否全部镜像下载完成:

root@master-1:~# docker images
REPOSITORY                                                                    TAG             IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.17.2         cba2a99699bd        2 months ago        116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.17.2         41ef50a5f06a        2 months ago        171MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.17.2         da5fd66c4068        2 months ago        161MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.17.2         f52d4c527ef2        2 months ago        94.4MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.6.5           70f311871ae1        4 months ago        41.6MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.3-0         303ce5db0e90        5 months ago        288MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.1             da86e6ba6ca1        2 years ago         742kB

单节点 master 初始化:

kubeadm init --apiserver-advertise-address=172.20.10.100 --apiserver-bind-port=6443  
--control-plane-endpoint=172.20.10.248  --ignore-preflight-errors=swap  
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers/  --kubernetes-version=v1.17.2 
 --pod-network-cidr=10.10.0.0/16  --service-cidr=192.168.1.0/20 --service-dns-domain=linux39.local
root@master-1:~# systemctl status kubelet  #查看是否kubelet服务开启
root@master-1:~# systemctl start kubelet

初始化结果

在这里插入图片描述

高可用 master 初始化

首先基于keepalived 实现高可用 VIP 然后实现 三台 k8s master 基于 VIP 实现高可用 。

基于命令初始化 高可用 master 方式
kubeadm init --apiserver-advertise-address=172.20.10.100 --control-plane-endpoint=172.20.10.248 --apiserver-bind-port=6443 --kubernetes-version=v1.17.2 --pod-network-cidr=10.10.0.0/16 --service-cidr=192.168.0.0/16 --service-dns-domain=linux39.local --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors=swap

在这里插入图片描述

基于文件初始化 高可用 master 方式
#kubeadm config print init defaults #输出 默认初始化 配置
# kubeadm config print init defaults > kubeadm init.yaml #将默认配置输出至文件
# vim kubeadm init.yaml #修改后的初始化文件内容
root@master-1:~# cat kubeadm-init.yaml 
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 48h0m0s  #默认24h
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.20.10.100  #本机地址
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master-1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.20.10.248:6443  #VIP访问地址
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #aliyun镜像地址
kind: ClusterConfiguration
kubernetesVersion: v1.17.2 #版本
networking:
  dnsDomain: linux39.local  #域名后缀
  podSubnet: 10.10.0.0/16   #pod地址段
  serviceSubnet: 192.168.0.0/20  #service地址段
scheduler: {}
root@master-1:~# kubeadm init --config kubeadm-init.yaml
。。。。。。略
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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join 172.20.10.248:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:80e631cffe4e2f14ab47e4ea940e789bef8f96e05f4f73feb8fd15863ffb4b80 \
    --control-plane 

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

kubeadm join 172.20.10.248:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:80e631cffe4e2f14ab47e4ea940e789bef8f96e05f4f73feb8fd15863ffb4b80 
配置 kube config 文件 及网络组件:

Kubeconfig 文件中包含 kube apiserver 地址 及 相关认证信息

配置 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@master-1:~# kubectl get node
NAME       STATUS     ROLES    AGE   VERSION
master-1   NotReady   master   13m   v1.17.2

部署网络 组件 flannel
https://github.com/coreos/flannel/

https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #wget组件文件地址

#wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# vim kube-flannel.yml
128      "Network": "10.10.0.0/16",   #修改地址为之前配置的podSubnet: 10.10.0.0/16 pod地址段

root@master-1:~# kubectl apply -f kube-flannel.yml  @启动网络组件

验证 master 节点状态:
root@master-1:~# kubectl get node
NAME       STATUS   ROLES    AGE   VERSION
master-1   Ready    master   27m   v1.17.2  #已经是ready状态
当前 maste 生成证书用于添加新控制节点
root@master-1:~# kubeadm init phase upload-certs --upload-certs #生成证书
I0329 14:45:20.893597     715 version.go:251] remote version is much newer: v1.18.0; falling back to: stable-1.17
W0329 14:45:26.167449     715 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0329 14:45:26.167461     715 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:
4cf4ccbd4d9a7695718a11e5f9ff024317c209214ae39f1522bc2058d13a55b9
添加新 master 节点

在另外一台已经安装了docker 、 kubeadm 和 kubelet 的 master 节点上执行以下操作
在master2 和master3中都执行下面的命令,由于需要重新pull镜像,所以需要的时间可能稍微就一些

#kubeadm join 172.20.10.248:6443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:80e631cffe4e2f14ab47e4ea940e789bef8f96e05f4f73feb8fd15863ffb4b80     --control-plane  --certificate-key 4cf4ccbd4d9a7695718a11e5f9ff024317c209214ae39f1522bc2058d13a55b9

在这里插入图片描述

kubeadm init 创建 k8s 集群流程:

https://k8smeetup.github.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow
init 创建 k8s 集群流程

验证 master 状态

验证master 状态:

root@master-1:~# kubectl get nodes
NAME       STATUS     ROLES    AGE     VERSION
master-1   Ready      master   73m     v1.17.2
master-2   Ready      master   30m     v1.17.2
master-3   Ready      master   15m     v1.17.2

1.4.6.1 验证 k8s 集群 状态:

root@master-1:~# kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   

当前 csr 证书状态

root@master-1:~# kubectl get csr
NAME        AGE     REQUESTOR                 CONDITION
csr-2ppfh   28m     system:bootstrap:abcdef   Approved,Issued
csr-45xst   6m48s   system:bootstrap:abcdef   Approved,Issued
csr-4m5z5   27m     system:bootstrap:abcdef   Approved,Issued
csr-tdblz   41m     system:bootstrap:abcdef   Approved,Issued
csr-xc4x6   56m     system:bootstrap:abcdef   Approved,Issued

k8s 集群 添加 node 节点:

各需要加入到 k8s master 集群中的 node 节点都要安装 docker kubeadm kubelet 因此都要重新执行安装 docker kubeadm kubelet 的步骤即配置 apt 仓库 、 配置 docker 加速器、安装命令、启动 kubelet 服务。

#添加命令为 master 端 kubeadm init 初始化完成之后 返回 的添加命令:

kubeadm join 172.20.10.248:6443 --token abcdef.0123456789abcdef     --discovery-token-ca-cert-hash sha256:80e631cffe4e2f14ab47e4ea940e789bef8f96e05f4f73feb8fd15863ffb4b80

在这里插入图片描述
注:Node 节点 会 自动 加入到 master 节点 下载镜像并启动 flannel ,直到最终在 master 看到 node 处于 Ready 状态 。

验证 node 节点状态

root@master-1:~# kubectl get nodes
NAME       STATUS   ROLES    AGE     VERSION
master-1   Ready    master   
master-2   Ready    master   
master-3   Ready    master  
node-1     Ready    <none>   
node-2     Ready    <none>   
node-3     Ready    <none>   
# kubectl get pod -A  #查看所有的pod节点
root@master-1:~# kubectl get node -o wide #wide格式看node节点信息
NAME       STATUS   ROLES    AGE    VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master-1   Ready    master   133m   v1.17.2   172.20.10.100   <none>        Ubuntu 18.04.4 LTS   4.15.0-55-generic   docker://19.3.8
master-2   Ready    master   90m    v1.17.2   172.20.10.101   <none>        Ubuntu 18.04.4 LTS   4.15.0-55-generic   docker://19.3.8
master-3   Ready    master   75m    v1.17.2   172.20.10.102   <none>        Ubuntu 18.04.4 LTS   4.15.0-55-generic   docker://19.3.8
node-1     Ready    <none>   62m    v1.17.2   172.20.10.200   <none>        Ubuntu 18.04.1 LTS   4.15.0-29-generic   docker://19.3.8
node-2     Ready    <none>   61m    v1.17.2   172.20.10.201   <none>        Ubuntu 18.04.4 LTS   4.15.0-29-generic   docker://19.3.8
node-3     Ready    <none>   40m    v1.17.2   172.20.10.202   <none>        Ubuntu 18.04.4 LTS   4.15.0-29-generic   docker://19.3.8
root@master-1:~# kubectl get service  #查看service
NAME         TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   192.168.0.1   <none>        443/TCP   134m

root@master-1:~# kubectl describe service kubernetes  #查看更加详细的内容
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                192.168.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         172.20.10.100:6443,172.20.10.101:6443,172.20.10.102:6443 #master集群地址
Session Affinity:  None
Events:            <none>

k8s创建容器并测试网络

创建测试容器 测试网络连接 是否可以通信

# kubectl run net-test1 --image=alpine --replicas=3 sleep 360000
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. 
Use kubectl run --generator=run-pod/v1 or kubectl create instead.  #命令可能在后版本替代 但是这里依旧还能用
deployment.apps/net-test1 created
# kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
net-test1-5fcc69db59-jz944   1/1     Running   0          74s  #runing表示已经起来
net-test1-5fcc69db59-wzlmg   1/1     Running   0          74s
net-test1-5fcc69db59-xthfd   1/1     Running   0          74s
root@master-1:~# kubectl exec -it net-test1-5fcc69db59-jz944 sh  #进入到node-1的pod
/ # 
/ # 
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr D2:E0:E2:79:C7:07  
          inet addr:10.10.3.2  Bcast:0.0.0.0  Mask:255.255.255.0  #pod网段地址
          UP BROADCAST RUNNING MULTICAST  MTU:1450  Metric:1
          RX packets:28 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2144 (2.0 KiB)  TX bytes:42 (42.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # ping 10.10.4.2   #和其他是否能够通信
PING 10.10.4.2 (10.10.4.2): 56 data bytes
64 bytes from 10.10.4.2: seq=0 ttl=62 time=39.220 ms
^C
--- 10.10.4.2 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 39.220/39.220/39.220 ms

/ # ping 10.10.5.2    #和其他是否能够通信
PING 10.10.5.2 (10.10.5.2): 56 data bytes
64 bytes from 10.10.5.2: seq=0 ttl=62 time=55.209 ms
64 bytes from 10.10.5.2: seq=1 ttl=62 time=23.486 ms
^C
--- 10.10.5.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 23.486/39.347/55.209 ms
/ # ping 172.20.10.1  #ping网关 看是否能够通信 
PING 172.20.10.1 (172.20.10.1): 56 data bytes
64 bytes from 172.20.10.1: seq=0 ttl=127 time=0.325 ms
^C
--- 172.20.10.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.325/0.325/0.325 ms
/ # ping 223.6.6.6   #ping外网 看是否能够通信  如果不能就是配置文件kube-flannel.yml通信地址问题 需要删除重建即可
PING 223.6.6.6 (223.6.6.6): 56 data bytes
64 bytes from 223.6.6.6: seq=1 ttl=127 time=9.826 ms
64 bytes from 223.6.6.6: seq=2 ttl=127 time=8.155 ms

/ # ping www.baidu.com #说明cornDNS解析也正确
PING www.baidu.com (61.135.169.125): 56 data bytes
64 bytes from 61.135.169.125: seq=0 ttl=127 time=4.740 ms
64 bytes from 61.135.169.125: seq=1 ttl=127 time=3.818 ms

更多咨询,关注微信公众号

赞(0)
开源学习 相互进步www.likai.tech » K8S学习–Kubeadm 安装 kubernetes-2-安装部署
分享到: 更多 (0)

评论 抢沙发