Kubernetes

从k8s集群搭建到拉取私有库镜像对外服务

本文主要是介绍从k8s集群搭建到拉取私有库镜像对外服务,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网上有很多教程是写如何如何搭建一个k8s集群的,其实有的文章我看了就头晕,所以干脆自己来写一篇

简单聊一下k8s

我们平时用docker部署几个容器,可以花很少的时间去管理和维护,但是假如在生产环境中有几百个容器,这该如何管理,并且还能保证我们的服务实现高可靠,高并发,于是k8s就出现了。
他能为我们提供一个可弹性运行分布式系统的框架,主要可以为我们实现以下功能

  • 服务发现、负载均衡
  • 自动部署和回滚
  • 自动完成装箱计算(比如弹性伸缩)
  • 自我修复

好了直接切入主题,在我们开始搭建之前,已经假设你对k8s的基础架构已经有一定的认识

我用的vm虚拟机建立了2台linux服务器,每台2G内存和2CPU(最好是三台及三台以上的奇数个服务器),其中一台为master,其余一台是node节点,linux内核版本为7.9,k8s client和server的版本都是1.5.2(yum包的最新版本)

角色 主机名 IP地址
Master master 192.168.175.3
Node node1 192.168.175.250

接下来我们会分为以下四个步骤

  • 准备系统环境(所有节点)
  • 配置master
  • 配置minion节点(node)*到这里集群已经搭建完毕
  • 拉取镜像启动服务

第一步:将系统环境准备好,以便这些因素不会影响我们的搭建,如下所示,你只需要复制粘贴就可以了,每台机器都要这样做

# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# 关闭selinux
# 临时禁用selinux
setenforce 0
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 禁用交换分区
swapoff -a
# 永久禁用,打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
# 修改内核参数
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

第二步:配置master

  • 从yum包安这几个服务,k8s默认安装最新的,目前是1.5.2
命令:[root@master ~]# yum install -y kubernetes etcd flannel ntp
命令:[root@node1 ~]# yum install -y kubernetes etcd flannel ntp
  • 配置etcd
命令:[root@master ~]# vim /etc/etcd/etcd.conf                  #修改以下配置
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.175.3:2379"
ETCD_NAME="etcd"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.175.3:2379"

  • 启动服务
命令:[root@master ~]# systemctl start etcd
命令:[root@master ~]# systemctl status etcd
命令:[root@master ~]# systemctl enable etcd

  • 查看状态
命令:[root@master ~]# ss -antulp | grep 2379

  • 检查 etcd 集群成员列表
命令:[root@master ~]# etcdctl member list 只有一台

  • 配置master配置文件
命令:[root@master ~]# vim /etc/kubernetes/config                    #修改以下配置文件
KUBE_MASTER="--master=http://192.168.175.3:8080"

  • 配置apiserver配置文件
命令:[root@master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.175.3:2379"
KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit"

  • 配置 kube-scheduler 配置文件
命令:[root@master ~]# vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="0.0.0.0"

  • 配置 etcd,指定容器云中 docker 的 IP 网段
命令:[root@master ~]# etcdctl mkdir /k8s/network
命令:[root@master ~]# etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'
命令:[root@master ~]# etcdctl get /k8s/network/config

  • 设置flanneld服务
命令:[root@master ~]# vim /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://192.168.175.3:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"                           #设置自己的通信物理网卡

  • 启动master上4个服务
命令:[root@master ~]# systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld
命令:[root@master ~]# systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld
命令:[root@master ~]# systemctl enable kube-apiserver kube-controller-manager kube-scheduler flanneld

第三步,配置minion节点

  • 配置flanneld服务
命令:[root@node1 ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.175.3:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"

  • 配置kube下的config
命令:[root@node1 ~]# vim  /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.175.3:8080"

  • 配置kubelet
命令:[root@node1 ~]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.175.3:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

  • 启动node1服务
命令:[root@node1 ~]# systemctl restart flanneld kube-proxy kubelet docker
命令:[root@node1 ~]# systemctl enable flanneld kube-proxy kubelet docker
命令:[root@node1 ~]# systemctl status flanneld kube-proxy kubelet docker
  • 在masters上运行 命令:[root@master ~]# kubectl get nodes 可以看到ready状态的node1

***至此k8s集群已经搭建完毕

第四步,从自己私有镜像库拉取镜像并部署服务

  • 创建一个Deployment类型的yml文件,取名为k8s_deployment,yml,其内容如下
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: hello-k8s
spec:
replicas: 2
template:
  metadata:
    labels:
      app: hello-k8s
  spec:
    containers:
      - name: k8s
        image: liuqiangdocker/qiangk8s:v1.0
        ports:
          - containerPort: 8888
  • 创建一个service yml,取名为k8s_service.yml
apiVersion: v1
kind: Service
metadata:
  name: hello-k8s
spec:
  type: NodePort
  ports:
    - port: 8888
      nodePort: 30001
  selector:
    app: hello-k8s

  • 通过命令根据yml来创建并运行我们的容器
kubectl create -f k8s_deployment.yml
kubectl create -f k8s_service.yml

**********
特别特别注意:由于k8s版本更迭太快,1.5.2不支持apiVersion: apps/v1  service: Deployment,如果报 kind not match相关的很大可能是版本不对
  • 查看master
我们可以用 kubectl get pod 来查看我们创建的容器,因为我在deployment里面,将replica设置为2

如果你发现你的pod处于ContainerCreating状态,可以用这个命令查看pod的细节 kubectl describe pod 你的pod名,主要看detail,我就出现这个问题


查了资料原来是这个目录是一个空目录,通过软链指过去的,这篇文章可以解决你的问题
转载 https://blog.csdn.net/weixin_37480442/article/details/81949217

  • 你可以通过每个pod的clusterIP:端口号(是容器的端口号,不是nodePort,kubectl get service )来访问这个web服务
    custerIP可以通过kubectl get Pods -o wide 获得
  • 你也可以使用minion的ip地址加端口号(nodePort的端口号,就是外部端口)***不要用master的IP+端口,因为集群master不承担业务功能,只起到管理功能,业务由其他minion节点承担

Over,欢迎读者交流

这篇关于从k8s集群搭建到拉取私有库镜像对外服务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!