一 关于镜像的下载可以参考这
利用阿里云海外主机进行构建
# 这里基于 kubernetes-version 1.15.0
二 环境的搭建
中文文档
说明:k8s底层的运行环境不一定必须是Docker,Docker只是其中一种,这里以此来进行说明
各部分的概况
主机功能 | |
---|---|
server1(172.25.2.1) | k8s集群的master节点 |
server2(172.25.2.2) | k8s集群的worker node1 |
server3(172.25.2.3) | k8s集群的worker node2 |
提醒自己:后续做成高可用的!
(0)做好免密认证--->很重要
server1————>server2、server3
ssh-keygen
ssh-copy-id server2
ssh server2
ssh-copy-id server3
ssh server3
# 一定要测试
(1)docker基础的搭建
# 防火墙和selinux关闭-->为了不必要的麻烦
# server1、server2、server3完成相同的事情-->真实主机搭建docker的yum源!
yum install docker-ce -y
systemctl enable docker
systemctl start docker
# 选择的docker版本是18.0.6的版本
(1.5)关闭swap分区
vim /etc/fstab
swapoff -a
# 三个节点都要做
# 其他镜像源、hosts、yum源都配置好
(2)kubernets的搭建
源:从阿里云下载相应版本的软件包,因为与镜像的版本相匹配!
整个搭建的流程跟着官方文档走!
资源:交给集群来管理!
# 安装三个软件包(三个节点)-->其中一个是依赖!
# 思路: 通过配置阿里云k8s网络源-->下载kubectl-版本形式 kubeadm-版本形式 kubelet-版本形式
yum install kube*
kubectl-1.15.0-0.x86_64 already
kubeadm-1.15.0-0.x86_64 already
kubernetes-cni-0.7.5-0.x86_64
kubelet-1.15.0-0.x86_64
# 开机启动-->并不会启动(可以通过status来看其状态)
systemctl enable kubelet
systemctl start kubelet
# 说明:kubelet现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环
(3)路由设置
# 三个节点
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 重新加载内核策略
sysctl --system
(4)在 Master 节点上配置 kubelet 所需的 cgroup 驱动,为了与RHEL7的systemd匹配
说明:非必须
### Install required packages.
yum install yum-utils device-mapper-persistent-data lvm2 -y
# Setup daemon.
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
mkdir -p /etc/systemd/system/docker.service.d
# Restart Docker
systemctl daemon-reload
systemctl restart docker
# 注意:对应的docker版本和RHEL7版本(7.4以上的)
(5)导入镜像
# 三个节点都事先导入镜像-->google镜像不能直接下载
for i in *.tar;do docker load -i $i;done
# 注意与k8s版本匹配-->海外主机进行构建的-->7个
coredns.tar kube-apiserver.tar kube-proxy.tar pause.tar
etcd.tar kube-controller-manager.tar kube-scheduler.tar
说明:相关镜像的导入最好在docker服务开启之后就进行,不要等到k8s软件安装再导入
(6)准备初始化
master(server1)选择一个 Pod 网络插件(fannel),设置 --Pod-network-cidr 来指定网络驱动的 CIDR
kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=172.25.2.1
警告-->不是特别爽
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver.
The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
# 参照上面的解决办法
其他
#(1)以普通用户的身份来运行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#(2)给集群部署一个pod网络
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
# 可选方案的连接-->https://kubernetes.io/docs/concepts/cluster-administration/addons/
#(3)在每一个worker node上以root用户运行,加入集群中
# Then you can join any number of worker nodes by running the following on each as root:
# server2和server3完成的事情
kubeadm join 172.25.2.1:6443 --token 1vin9q.9382h91t7hb1mgph \
--discovery-token-ca-cert-hash sha256:c727cb89621790359b6071ebc9f74b6a1a08f5969df26d392709c8c2fb3a2fe0
kubeadm init 未能成功---> kubeadm reset
[preflight] Running pre-flight checks
[reset] WARNING: Changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] Are you sure you want to proceed? [y/N]: y
[preflight] Running pre-flight checks
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
[reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes]
加入节点完成的事情--->论免密的重要性
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.15" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
master完成其他要求
# 要求必须是一个普通用户的身份来运行
[root@server1 ~]# vim /etc/sudoers
kubeadm ALL=(ALL) NOPASSWD: ALL #93行左右
# 切换普通用户完成的操作
[root@server1 ~]# su - kubeadm
[kubeadm@server1 ~]$ mkdir -p $HOME/.kube
[kubeadm@server1 ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[kubeadm@server1 ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
[kubeadm@server1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 NotReady master 24m v1.15.0
server2 NotReady <none> 22m v1.15.0
server3 NotReady <none> 19m v1.15.0
注意:此时所有节点的状态为not ready,因为还没有设置网络!
下一步:各个节点安装网络插件
# 一个是yml的配置文件,一个是flannel的网络插件(前面我们选择的是这种网络方式)
flannel.tar kube-flannel.yml
# 注意:3个节点都需要此网络插件
[root@server1 ~]# docker load -i flannel.tar
[root@server2 ~]# docker load -i flannel.tar
[root@server3 ~]# docker load -i flannel.tar
下一步:进行部署
说明:k8s要求普通用户身份来部署kube-flannel.yml
[root@server1 ~]# mv kube-flannel.yml /home/kubeadm/
[root@server1 ~]# su - kubeadm
Last login: Sun Aug 18 20:58:16 CST 2019 on pts/0
[kubeadm@server1 ~]$ kubectl apply -f kube-flannel.yml
# 只需要在master进行部署
# brctl的软件包-->yum install bridge-utils-1.5-9.el7.x86_64 -y >/dev/null
说明:此时server1和server2以及server3通过flannel网络
# 发现有一个新的虚拟网卡-->flannel.1
# pod的网络
server1 10.244.0.0
server2 10.244.1.0
server3 10.244.2.0
补充:关于flannel的网络原理后续说明
# 说明:此时处于就绪状态
[kubeadm@server1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 50m v1.15.0
server2 Ready <none> 49m v1.15.0
server3 Ready <none> 46m v1.15.0
小技巧:不能自动补全是不是很烦人
# 执行此条指令
[kubeadm@server1 ~]$ echo "source <(kubectl completion bash)" >>.bashrc
[kubeadm@server1 ~]$ source .bashrc
测试--->都是Runing就是OK的
[kubeadm@server1 ~]$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-5c98db65d4-5ql2r 1/1 Running 0 54m
kube-system coredns-5c98db65d4-jrrgz 1/1 Running 0 54m
kube-system etcd-server1 1/1 Running 0 54m
kube-system kube-apiserver-server1 1/1 Running 0 53m
kube-system kube-controller-manager-server1 1/1 Running 0 54m
kube-system kube-flannel-ds-amd64-97flb 1/1 Running 0 18m
kube-system kube-flannel-ds-amd64-cm4lh 1/1 Running 0 18m
kube-system kube-flannel-ds-amd64-xlsp9 1/1 Running 0 18m
kube-system kube-proxy-nlc7h 1/1 Running 0 53m
kube-system kube-proxy-rzwlh 1/1 Running 0 54m
kube-system kube-proxy-z88r7 1/1 Running 0 50m
kube-system kube-scheduler-server1 1/1 Running 0 51m
整个部署过程是这样的:
① kubectl 发送部署请求到 API Server
② API Server 通知 Controller Manager 创建一个 deployment 资源
③ Scheduler 执行调度任务,将两个副本 Pod 分发到 node1 和 node2
④ node1 和 node2 上的 kubelet 在各自的节点上创建并运行 Pod