架构师的成长之路初片~Virtual-kubernetes——云平台部署

官方IP  https://kubernetes.io/docs/home/

Kubernetes(K8S)
Google为创造者,2014年宣布开源

为什么要使用k8s?

  有大量跨主机的容器需要管理

  快速部署应用

  快速扩展应用

  无缝对接新的应用功能

  节省资源,优化硬件资源的使用

为什么需要K8s?
因为容器在编排、管理和调度等各个方面,管理不易。将Docker应用于具体的业务实现,较为困难。
K8S是什么?
K8s是容器集群管理系统,可实现容器集群的自动化部署、自动扩缩容、维护等功能

K8S集群核心角色
master(管理节点)
  apiserver\scheduler\etcd\controllermanager
node(计算节点)
  kubelet\kube-proxy\docker
  image(镜像仓库)

 

K8S集群架构图解

 

 

 

角色与功能

K8S master节点(管理节点)

  Master提供集群的控制

  对集群进行全局的决策

  检测和响应集群事件

  Master主要由apiserver,scheduler,etcd和controllermanager服务组成

 

K8S node节点(计算节点)

  运行实际容器节点

  维护运行Pod,并提供具体应用的运行环境

  node由kubelet、kube-proxy和docker组成

  计算节点被设计成水平扩展,该组件在多个节点上运行

 

环境:

按照如下配置准备云主机

主机名      IP地址          最低配置
master      192.168.1.21      2CPU,2G内存
node-0001    192.168.1.31      2CPU,2G内存
node-0002    192.168.1.32      2CPU,2G内存
node-0003    192.168.1.33      2CPU,2G内存
registry     192.168.1.100      1CPU,1G内存



内核版本 >=3.10            /uname -r
最低配置2cpu,2G内存
节点之中不可以有重复的主机名、MAC地址....
卸载防火墙            /rpm -evh firewalld-*
禁用swap            /free -m
禁用selinux          /cat /etc/selinux/conf

 

 

K8S集群安装部署

1:私有镜像仓库:

2:Master安装部署

  2.1安装工具部署

  2.2服务镜像部署

  2.3:master安装

3:node安装部署

  3.1:token管理

  3.2:node安装

 

------------------------------------------------------------------------------

1:私有镜像仓库:

1:安装仓库服务
[root@registry ~]# yum makecache
[root@registry ~]# yum install -y docker-distribution
[root@registry ~]# systemctl enable --now docker-distribution


2:使用脚本初始化仓库

拷贝云盘 kubernetes/v1.17.6/registry/myos目录 到 仓库服务器

[root@registry ~]# cd myos
[root@registry ~]# chmod 755 init-img.sh
[root@registry ~]# ./init-img.sh
[root@registry ~]# curl http://192.168.1.100:5000/v2/myos/tags/list
{"name":"myos","tags":["nginx","php-fpm","v1804","httpd"]}
 
脚本:
yum install -y docker-ce
mkdir -p /etc/docker
cat >/etc/docker/daemon.json <<'EOF'
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://hub-mirror.c.163.com"],
    "insecure-registries":["192.168.1.100:5000", "registry:5000"]
}
EOF
systemctl enable --now docker.service
systemctl restart docker.service
docker load -i myos.tar.gz
# init apache images
cat >Dockerfile<<'EOF'
FROM myos:latest
ENV  LANG=C
WORKDIR /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
EOF
docker build -t 192.168.1.100:5000/myos:httpd .

# init php-fpm images
cat >Dockerfile<<'EOF'
FROM myos:latest
EXPOSE 9000
WORKDIR /usr/local/nginx/html
CMD ["/usr/sbin/php-fpm", "--nodaemonize"]
EOF
docker build -t 192.168.1.100:5000/myos:php-fpm .

# init nginx images
cat >Dockerfile<<'EOF'
FROM myos:latest
EXPOSE 80
WORKDIR /usr/local/nginx/html
CMD  ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
EOF
docker build -t 192.168.1.100:5000/myos:nginx .

# upload images
rm -f Dockerfile
docker tag myos:latest 192.168.1.100:5000/myos:v1804
for i in v1804 httpd php-fpm nginx;do
    docker push 192.168.1.100:5000/myos:${i}
done

内部还有2个centos及..容器的镜像

 

安装Master

 

 API Server

  是整个系统的对外接口,供客户端和其他组件调用

  后端元数据存储与etcd中(键值数据库)

Scheduler

  负责对集群内部的资源进行调度,类似与“调度室”

Controller manager

  负责管理控制器,相当于“大总管”

etc键值管理

  采用键值对的形象存储信息

 

服务端口

 

安装软件包:

kubeadm\kubectl\kubelet\docker-ce

[root@master ~]# yum makecache
[root@master ~]# yum install -y kubeadm kubelet kubectl docker-ce
[root@master ~]# mkdir -p /etc/docker
[root@master ~]# vim /etc/docker/daemon.json 
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": ["https://hub-mirror.c.163.com"],
    "insecure-registries":["192.168.1.100:5000", "registry:5000"]    //指定仓库
}
[root@master ~]# systemctl enable --now docker kubelet
[root@master ~]# docker info |grep Cgroup                    //查看状态
Cgroup Driver: systemd
[root@master ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1                    //开启桥设备内核监控功能(ipv6)
net.bridge.bridge-nf-call-iptables = 1                    //开启桥设备内核监控功能(ipv4)
net.ipv4.ip_forward = 1                            //开启路由转发
[root@master ~]# modprobe br_netfilter                    //加载内核模块
[root@master ~]# sysctl --system                        //加载上面的k8s.conf配置文件

4:镜像导入私有仓库

# 把云盘 kubernetes/v1.17.6/base-images 中的镜像拷贝到 master
[root@master ~]# cd base-images/
[root@master base-image]# for i in *.tar.gz;do docker load -i ${i};done
[root@master base-image]# docker images
[root@master base-image]# docker images |awk '$2!="TAG"{print $1,$2}'|while read _f _v;do
    docker tag ${_f}:${_v} 192.168.1.100:5000/${_f##*/}:${_v}; 
    docker push 192.168.1.100:5000/${_f##*/}:${_v}; 
    docker rmi ${_f}:${_v}; 
done
# 查看验证
[root@master base-image]# curl http://192.168.1.100:5000/v2/_catalog      //查看仓库中的镜像,是否上传完成


5、Tab键设置

由于k8s的命令长,所以我们导入tab健的命令

[root@master ~]# kubectl completion bash >/etc/bash_completion.d/kubectl
[root@master ~]# kubeadm completion bash >/etc/bash_completion.d/kubeadm
[root@master ~]# exit


6、安装IPVS代理软件包

[root@master ~]# yum install -y ipvsadm ipset


7、配置主机名

[root@master ~]# vim /etc/hosts
192.168.1.21    master
192.168.1.31    node-0001
192.168.1.32    node-0002
192.168.1.33    node-0003
192.168.1.100    registry

8、使用kubeadm部署

应答文件在云盘的 kubernetes/v1.17.6/config 目录下

生成 kubeadm-init.yaml   文件的命令 :
kubeadm config print init-defaults > kubeadm-init.yaml
应答文件在云盘的 kubernetes/v1.17.6/config 目录下

[root@master ~]# mkdir init;cd init
# 拷贝 kubeadm-init.yaml 到 master 云主机 init 目录下
[root@master init]# kubeadm init --config=kubeadm-init.yaml |tee master-init.log
# 根据提示执行命令
[root@master init]# mkdir -p $HOME/.kube
[root@master init]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master init]# sudo chown $(id -u):$(id -g) $HOME/.kube/config


9、验证安装结果

[root@master ~]# kubectl version
[root@master ~]# kubectl get componentstatuses
NAME                        STATUS          MESSAGE                 ERROR
controller-manager           Healthy         ok
scheduler                   Healthy           ok
etcd-0                         Healthy           {"health":"true"}

 

 

计算节点安装

1:获取master的token

# 创建token
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
[root@master ~]# kubeadm token list
# 获取token_hash
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt |openssl rsa -pubin -outform der |openssl dgst -sha256 -hex


2、node安装

拷贝云盘上 kubernetes/v1.17.6/node-install 到跳板机

[root@ecs-proxy ~]# cd node-install/
[root@ecs-proxy node-install]# vim files/hosts
::1             localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.21    master
192.168.1.31    node-0001
192.168.1.32    node-0002
192.168.1.100   registry
[root@ecs-proxy node-install]# vim node_install.yaml
... ...
  vars:
    master: '192.168.1.21:6443'
    token: 'fm6kui.mp8rr3akn74a3nyn'
    token_hash: 'sha256:f46dd7ee29faa3c096cad189b0f9aedf59421d8a881f7623a543065fa6b0088c'
... ...
[root@ecs-proxy node-install]# ansible-playbook node_install.yaml


3、验证安装

[root@master ~]# kubectl get nodes
NAME        STATUS     ROLES    AGE     VERSION
master      NotReady   master   130m    v1.17.6
node-0001   NotReady   <none>   2m14s   v1.17.6
node-0002   NotReady   <none>   2m15s   v1.17.6
节点      就绪状态  


网络插件安装配置

软件地址:https://github.com/coreos/flannel
资源文件:kube-flannel.yml
镜像文件:flannel.tar.gz

 

拷贝云盘 kubernetes/v1.17.6/flannel 目录到 master 上


1、上传镜像到私有仓库

[root@master ~]# cd flannel
[root@master flannel]# docker load -i flannel.tar.gz
[root@master flannel]# docker tag quay.io/coreos/flannel:v0.12.0-amd64 192.168.1.100:5000/flannel:v0.12.0-amd64
[root@master flannel]# docker push 192.168.1.100:5000/flannel:v0.12.0-amd64


2、修改配置文件并安装

[root@master flannel]# vim kube-flannel.yml
128: "Network": "10.244.0.0/16",
172: image: 192.168.1.100:5000/flannel:v0.12.0-amd64
186: image: 192.168.1.100:5000/flannel:v0.12.0-amd64
227-结尾: 删除
[root@master flannel]# kubectl apply -f kube-flannel.yml

3、验证结果

[root@master flannel]# kubectl get nodes
NAME          STATUS    ROLES    AGE        VERSION
master        Ready    master    26h        v1.17.6
node-0001    Ready    <none>    151m    v1.17.6
node-0002    Ready    <none>    152m    v1.17.6

---flannel理论---

Flannel实质上是一种“覆盖网络(overlay network)”,也就是将tcp数据包装在另一种网络包里面进行路由转发和通信,目前已经
支持UDP、VxLAN\AWS\VPC和GCE路由等数据转发方式
使用flannel目标
  不同主机内的容器实现互联互通

结构图如下:

 

 

 

软件地址: https://github.com/coreos/flannel

资源文件:  kube-flannel.yml

镜像文件:  flannel.tar.gz

 

posted @ 2021-05-13 18:53  樱花泪  阅读(83)  评论(0编辑  收藏  举报