附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- ...
随机推荐
- HDU5973 Game of Geting Stone(威佐夫博弈)
Two people face two piles of stones and make a game. They take turns to take stones. As game rules, ...
- C++ 代码小技巧(一)
在写代码的时候,我们常常会用一些小技巧,下面做简单介绍 一.o1+o2+o3(常数优化) 如题,开优化开关. 有的OJ上有O2优化选项,当然,你也可以这样:在代码开头这样加一句: #pragma GC ...
- 打开TXT文件并显示
<!DOCTYPE html> <html> <head> <title></title> <script> function ...
- Redis实战 | 5种Redis数据类型详解
我们知道Redis是目前非常主流的KV数据库,它因高性能的读写能力而著称,其实还有另外一个优势,就是Redis提供了更加丰富的数据类型,这使得Redis有着更加广泛的使用场景.那Redis提供给用户的 ...
- [Java并发] AQS抽象队列同步器源码解析--独占锁释放过程
[Java并发] AQS抽象队列同步器源码解析--独占锁获取过程 上一篇已经讲解了AQS独占锁的获取过程,接下来就是对AQS独占锁的释放过程进行详细的分析说明,废话不多说,直接进入正文... 锁释放入 ...
- JavaEE基础(05):过滤器、监听器、拦截器,应用详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Listener监听器 1.概念简介 JavaWeb三大组件:Servlet,Listener,Filter.监听器就是指在应用程序中监听 ...
- 【docker】Dockerfile
[docker]Dockerfile 转载: ============================================================= =============== ...
- Android(常用)主流UI开源库整理
这几天刚做完一个项目..有点空余时间,就想着吧这一两年做的项目中的UI界面用到的一些库整理一下.后来想了一下,既然要整理,就把网上常用的 AndroidUI界面的主流开源库 一起整理一下,方便查看. ...
- 后缀数组SA入门(史上最晦涩难懂的讲解)
参考资料:victorique的博客(有一点锅无伤大雅,记得看评论区),$wzz$ 课件(快去$ftp$%%%),$oi-wiki$以及某个人的帮助(万分感谢!) 首先还是要说一句:我不知道为什么我这 ...
- CentOS7 安装 Redis 并设置开机启动
1.下载 https://redis.io/download cd /usr/local/src wget -c http://download.redis.io/releases/redis-3.2 ...