附003.Kubeadm部署Kubernetes
一 kubeadm介绍
1.1 概述
1.2 kubeadm功能
- kubeadm init 启动一个 Kubernetes 主节点;
- kubeadm join 启动一个 Kubernetes 工作节点并且将其加入到集群;
- kubeadm upgrade 更新一个 Kubernetes 集群到新版本;
- kubeadm config 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令;
- kubeadm token 管理 kubeadm join 使用的令牌;
- kubeadm reset 还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改;
- kubeadm version 打印 kubeadm 版本;
- kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈。
二 kubeadm安装
2.1 前置条件
|
规则
|
方向
|
端口范围
|
作用
|
使用者
|
|
TCP
|
Inbound
|
6443*
|
Kubernetes API server
|
All
|
|
TCP
|
Inbound
|
2379-2380
|
etcd server client API
|
kube-apiserver, etcd
|
|
TCP
|
Inbound
|
10250
|
Kubelet API
|
Self, Control plane
|
|
TCP
|
Inbound
|
10251
|
kube-scheduler
|
Self
|
|
TCP
|
Inbound
|
10252
|
kube-controller-manager
|
Self
|
|
规则
|
方向
|
端口范围
|
作用
|
使用者
|
|
TCP
|
Inbound
|
10250
|
Kubelet API
|
Self, Control plane
|
|
TCP
|
Inbound
|
30000-32767
|
NodePort Services**
|
All
|
2.2 节点规划
|
节点
|
IP
|
类型
|
|
Master
|
172.24.8.71
|
Kubernetes master节点
|
|
node1
|
172.24.8.72
|
Kubernetes node节点1
|
|
node2
|
172.24.8.73
|
Kubernetes node节点2
|
提示:本实验使用单master部署,生产中可部署奇数个master以做高可用。
2.3 手动添加解析
[root@master ~]# cat <<EOF >> /etc/hosts
172.24.8.71 master
172.24.8.72 node1
172.24.8.73 node2
EOF
2.4 修正iptables
[root@k8s_master ~]# cat <<EOF >> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@master ~]# modprobe br_netfilter
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
2.5 加载IPVS
[root@master ~]# cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
[root@master ~]# chmod /etc/sysconfig/modules/ipvs.modules
[root@master ~]# bash /etc/sysconfig/modules/ipvs.modules
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
[root@master ~]# yum -y install ipvsadm

2.6 安装Docker
[root@master ~]# yum -y update
[root@master ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@master ~]# yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master ~]# yum list docker-ce --showduplicates | sort -r #查看可用版本
[root@master ~]# yum -y install docker-ce-18.09.0-3.el7 #kubeadm当前不支持18.09以上版本
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF #配置system管理cgroup
[root@master ~]# vi /usr/lib/systemd/system/docker.service #更改docker镜像路径
ExecStart=/usr/bin/dockerd-current --data-root=/data/docker #修改为独立的单独路径
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker
[root@master ~]# iptables -nvL #确认iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT。

Kubernetes 1.13版本兼容docker版本等可参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.13.md。
2.7 相关组件包
2.8 正式安装
[root@master ~]# 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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#配置yum源
[root@master ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

[root@master ~]# systemctl enable kubelet
2.9 其他调整
[root@master ~]# echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
[root@master ~]# sysctl -p /etc/sysctl.d/k8s.conf
三 初始化最简集群-Mater
3.1 Master上初始化
[root@master ~]# kubeadm init --kubernetes-version=v1.14.0 --pod-network-cidr=10.244.0.0/16

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# export KUBECONFIG=$HOME/.kube/config #声明配置文件

- [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
- [certificates]生成相关的各种证书
- [kubeconfig]生成相关的kubeconfig文件
- [bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
3.2 查看集群状态
[root@master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
四 安装flannel插件
4.1 NIC插件介绍
4.2 下载flannel配置
[root@master ~]# mkdir flannel
[root@master ~]# cd flannel/
[root@master flannel]# wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
[root@master flannel]# kubectl apply -f kube-flannel.yml
[root@master ~]# kubectl get pod --all-namespaces -o wide #查看相关pod

[root@master ~]# kubectl describe node master | grep Taint
Taints: node-role.kubernetes.io/master:NoSchedule
[root@master ~]# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
[root@master ~]# kubectl get pods --all-namespaces #查看验证
[root@master ~]# kubectl get nodes

五 Node节点安装
5.1 node节点准备
5.2 加入集群
[root@node1 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
[root@node1 ~]# kubeadm join 172.24.8.71:6443 --token v6xij5.cdhd5h5hspohf1kc \
--discovery-token-ca-cert-hash sha256:94b9a19c3d4b9bd7b4f0ff86a882dad5fe4549b0365626e7f4d26831c9caa0c4
[root@node2 ~]# echo "1" >/proc/sys/net/ipv4/ip_forward
[root@node2 ~]# kubeadm join 172.24.8.71:6443 --token v6xij5.cdhd5h5hspohf1kc \
--discovery-token-ca-cert-hash sha256:94b9a19c3d4b9bd7b4f0ff86a882dad5fe4549b0365626e7f4d26831c9caa0c4

5.3 确认验证
[root@master ~]# kubectl get nodes #节点状态
[root@master ~]# kubectl get cs #组件状态
[root@master ~]# kubectl get serviceaccount #服务账户
[root@master ~]# kubectl cluster-info #集群信息
[root@master ~]# kubectl get pod -n kube-system -o wide #所有服务状态

六 开启IPVS
6.1 修改ConfigMap
[root@master ~]# kubectl edit cm kube-proxy -n kube-system #模式改为ipvs
……
mode: "ipvs"
……
[root@master ~]# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
[root@master ~]# kubectl get pod -n kube-system | grep kube-proxy #查看proxy的pod
[root@master ~]# kubectl logs kube-proxy-mgqfs -n kube-system #查看任意一个proxy pod的日志

七 集群节点移除
7.1 master节点移除node2
[root@master ~]# kubectl drain node2 --delete-local-data --force --ignore-daemonsets
[root@master ~]# kubectl delete node node2
[root@master ~]# kubectl get nodes

7.2 node2节点重置
[root@node2 ~]# kubeadm reset
[root@node2 ~]# ifconfig cni0 down
[root@node2 ~]# ip link delete cni0
[root@node2 ~]# ifconfig flannel.1 down
[root@node2 ~]# ip link delete flannel.1
[root@node2 ~]# rm -rf /var/lib/cni/
7.3 卸载(删除)集群
八 测试集群
8.1 创建测试service
[root@master ~]# kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=nginx --port=80
[root@master ~]# kubectl expose deployment nginx --type=NodePort --name=example-service #暴露端口
[root@master ~]# kubectl get service #查看服务状态
[root@master ~]# kubectl describe service example-service #查看信息

8.2 测试访问
[root@master ~]# curl 10.102.244.218:80

[root@master ~]# kubectl get pod -o wide #查看endpoint

[root@master ~]# curl 10.244.3.2:80 #访问endpoint,与访问服务ip结果相同
[root@master ~]# curl 10.244.1.2:80
附一:kubeadm init参数
--apiserver-advertise-address string:API Server将要广播的监听地址。如指定为`0.0.0.0` 将使用缺省的网卡地址。
--apiserver-bind-port int32:API Server绑定的端口,缺省值: 6443
--apiserver-cert-extra-sans stringSlice:可选的额外提供的证书的别名,(SANs)用于指定API Server的服务器证书。可以是IP地址也可以是DNS名称。 --cert-dir string:证书的存储路径,缺省值: "/etc/kubernetes/pki"
--config string:kubeadm配置文件的路径。
--cri-socket string:指明要连接的CRI socket文件,缺省值: "/var/run/dockershim.sock"
--dry-run:不会应用任何改变,只会输出将要执行的操作,即测试运行。
--feature-gates string:键值对的集合,用来控制各种功能的开关。可选项有:
Auditing=true|false (当前为ALPHA状态 - 缺省值=false)
CoreDNS=true|false (缺省值=true)
DynamicKubeletConfig=true|false (当前为BETA状态 - 缺省值=false)
-h, --help:获取init命令的帮助信息。
--ignore-preflight-errors stringSlice:忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误。
--kubernetes-version string:为control plane选择一个特定的Kubernetes版本,缺省值: "stable-1"
--node-name string:指定节点的名称。
--pod-network-cidr string:指明pod网络可以使用的IP地址段。如果设置了这个参数,control plane将会为每一个节点自动分配CIDRs。
--service-cidr string:为service的虚拟IP地址另外指定IP地址段,缺省值: "10.96.0.0/12"
--service-dns-domain string:为services另外指定域名, 例如: "myorg.internal",缺省值: "cluster.local"
--skip-token-print:不打印出由 `kubeadm init` 命令生成的默认令牌。
--token string:这个令牌用于建立主从节点间的双向受信链接。格式为 [a-z0-9]{6}\.[a-z0-9]{16} - 示例:abcdef.0123456789abcdef
--token-ttl duration:令牌被自动删除前的可用时长 (示例: 1s, 2m, 3h). 如果设置为 '0', 令牌将永不过期。缺省值: 24h0m0s
附二:kubeadm init过程
- kubeadm init 命令通过执行下列步骤来启动一个 Kubernetes master 节点。
- 在做出变更前运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告,其它的则会被视为错误并且退出 kubeadm,除非问题被解决或者用户指定了 --ignore-preflight-errors=<list-of-errors> 参数。
- 生成一个自签名的 CA证书 (或者使用现有的证书,如果提供的话) 来为集群中的每一个组件建立身份标识。如果用户已经通过 --cert-dir 配置的证书目录(缺省值为 /etc/kubernetes/pki)提供了他们自己的 CA证书 以及/或者 密钥, 那么将会跳过这个步骤。如果指定了 --apiserver-cert-extra-sans 参数, APIServer 的证书将会有额外的 SAN 条目,如果必要的话,将会被转为小写。
- 将 kubeconfig 文件写入 /etc/kubernetes/ 目录以便 kubelet、controller-manager 和 scheduler 用来连接到 API server,它们每一个都有自己的身份标识,同时生成一个名为 admin.conf 的独立的 kubeconfig 文件,用于管理操作。
- 如果 kubeadm 被调用时附带了 --feature-gates=DynamicKubeletConfig 参数, 它会将 kubelet 的初始化配置写入 /var/lib/kubelet/config/init/kubelet 文件中。 这个功能现在是默认关闭的,但是在未来的版本中很有可能会默认启用。
- 为 API server、controller manager 和 scheduler 生成静态 Pod 的清单文件。假使没有提供一个外部的 etcd 服务的话,也会为 etcd 生成一份额外的静态 Pod 清单文件。
- 静态 Pod 的清单文件被写入到 /etc/kubernetes/manifests 目录,kubelet 会监视这个目录以便在系统启动的时候创建 Pods。
- 一旦 control plane 的 Pods 都运行起来, kubeadm init 的工作流程就继续往下执行。
- 如果 kubeadm 被调用时附带了 --feature-gates=DynamicKubeletConfig 参数, 它将创建一份 ConfigMap 和一些便于 kubelet 访问这份 ConfigMap 的 RBAC 规则,并且通过将 Node.spec.configSource 指向到新创建的 ConfigMap 来更新节点设置。这样它就完成了对 Kubelet 的动态配置。 这个功能现在是默认关闭的,但是在未来的版本中很有可能会默认启用。
- 对 master 节点应用 labels 和 taints 以便不会在它上面运行其它的工作负载。
- 生成令牌以便其它节点以后可以使用这个令牌向 master 节点注册它们自己。 可选的,用户可以通过 --token 提供一个令牌。
- 为了使得节点能够遵照 Bootstrap Tokens 和 TLS Bootstrap这两份文档中描述的机制加入到集群中,kubeadm 会执行所有的必要配置:
- 创建一份 ConfigMap 提供添加集群节点所需的信息,并为该 ConfigMap 设置相关的 RBAC 访问规则。
- 使得 Bootstrap Tokens 可以访问 CSR 签名 API。
- 对新的 CSR 请求配置为自动签发。
附003.Kubeadm部署Kubernetes的更多相关文章
- 附025.kubeadm部署Kubernetes更新证书
一 查看证书 1.1 查看过期时间-方式一 1 [root@master01 ~]# tree /etc/kubernetes/pki/ 2 [root@master01 ~]# for tls in ...
- 附012.Kubeadm部署高可用Kubernetes
一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...
- 使用kubeadm部署Kubernetes v1.13.3
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: 1. 安装要求 在开始之前,部署Kubernetes集群 ...
- [原]使用kubeadm部署kubernetes(一)
####################### 以下为声明 ##################### 在公众号 木子李的菜田 输入关键词: k8s 有系列安装文档 此文档是之前做笔记在 ...
- [转帖]CentOS 7 使用kubeadm 部署 Kubernetes
CentOS 7 使用kubeadm 部署 Kubernetes 关闭swap 执行swapoff临时关闭swap. 重启后会失效,若要永久关闭,可以编辑/etc/fstab文件,将其中swap分 ...
- 02 . Kubeadm部署Kubernetes及简单应用
kubeadm部署Kubernetes kubeadm简介 # kubeadm是一位高中生的作品,他叫Lucas Kaldstrom,芬兰人,17岁用业余时间完成的一个社区项目: # kubeadm的 ...
- Kubeadm部署Kubernetes
Kubeadm部署Kubernetes 1.环境准备 主机名 IP 说明 宿主机系统 k8s-master 10.0.0.101 Kubernetes集群的master节点 Ubuntu2004 k8 ...
- 使用kubeadm部署Kubernetes集群
一.环境架构与部署准备 1.集群节点架构与各节点所需安装的服务如下图: 2.安装环境与软件版本: Master: 所需软件:docker-ce 17.03.kubelet1.11.1.kubeadm1 ...
- kubeadm部署Kubernetes集群
Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...
随机推荐
- CF 1131A,1131B,1131C,1131D,1131F(Round541 A,B,C,D,F)题解
A. Sea Battle time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- numpy的基本API(二)——维数操作
numpy的基本维数操作API iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 1.np.copyto(dst, src) copyto方法将数组src复制到 ...
- LSI系列芯片Raid卡配置方法、管理手册
说明 本手册适用于LSI芯片Raid卡 包括但不限于Inspur 2008/2108 Raid卡.LSI 9240/9260/9261/ 9271 等Raid卡. 不同型号的Raid卡在某些功能上的支 ...
- R语言计算IV值
更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在对变量分箱后,需要计算变量的重要性,IV是评估变量区分度或重要性的统计量之一,R语言计算IV值的代码如下: Ca ...
- SpringBoot系列之集成Mybatis教程
SpringBoot系列之集成Mybatis教程 环境准备:IDEA + maven 本博客通过例子的方式,介绍Springboot集成Mybatis的两种方法,一种是通过注解实现,一种是通过xml的 ...
- tensorflow mnist模块详解
tensorflow的官方文档是以mnist数据集为例子开始的.文档本身没有介绍tensorflow.contrib.learn.python.learn.datasets.mnist模块.要想用te ...
- 笔记||Python3之函数
函数: 函数的概念:就是一段代码:一段操作流程. 优点:代码量少.简洁. 维护起来方便 -- 在函数的定义进行修改 函数的定义:1 - def 函数名(): 函数内容 2 - 函 ...
- iSensor APP 之 摄像头调试 OV5642
iSensor APP 之 摄像头调试 OV5642 iSensor app 非常适合调试各种摄像头,已测试通过的sensor有: l OV7670.OV7725.OV9650.OV9655.OV ...
- 手把手教你打造一款轻量级canvas渲染引擎
背景 当我们开发一个canvas应用的时候,出于效率的考量,免不了要选择一个渲染引擎(比如PixiJS)或者更强大一点的游戏引擎(比如Cocos Creator.Layabox). 渲染引擎通常会有S ...
- 浅析Java String
String 特性 1.其定义的字符串序列不可变. 2.是一个final类,不可被继承,且其内部一些重要方法被定义为final类型,不可重写. 3.内部实现Serializable接口(支持字符串序列 ...