k8s(一)环境的的搭建

一   关于镜像的下载可以参考这

利用阿里云海外主机进行构建

# 这里基于  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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值