K8S学习–Kubeadm 安装 kubernetes-1-组件简介
使用批量 部署工具如 (ansible/ saltstack) 、 手动二进制 (很熟悉的时候可以尝试部署)、 kubeadm 、 apt-get /yum 等方式安装,以守护进程的方式 启动 在宿主机上,类似于是 N ginx 一样 使用 service 脚本启动。
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
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文件
具体步骤:
当前部署版本为当前次新版本, 因为后面需要 使用 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
角色<<< 主机名 <<
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
安装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解析
在全部的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 [email protected]
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
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 [::]:*
在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节点上配置即可
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
所有节点配置阿里云仓库地址并安装相关组件 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 </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只是命令
目前启动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 中任意一台 master 进行集群初始化 ,而且集群初始化只需要初始化一次。
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: {}
命令 使用:
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 日志里里不显示标题
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 节点 下载 镜像以减少安装等待时间 但是镜像默认使用 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
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
首先基于keepalived 实现高可用 VIP 然后实现 三台 k8s master 基于 VIP 实现高可用 。
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
#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
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状态
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
在另外一台已经安装了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
https://k8smeetup.github.io/docs/reference/setup-tools/kubeadm/kubeadm-init/#init-workflow
#init 创建 k8s 集群流程
验证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
root@master-1:~# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
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 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 状态 。
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>
创建测试容器 测试网络连接 是否可以通信
# 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