Kubernetes、KuberSphere初识和实践

2021年11月20日 阅读数:2
这篇文章主要向大家介绍Kubernetes、KuberSphere初识和实践,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

本文对KuberNetes 中的概念作简单介绍。同时记录了一次KuberNetes和KuberSphere的部署经历。node

初识Kubernetes

生产级别的容器编排系统
自动化的容器部署、扩展和管理linux

简单的说Kubernetes就是用来管理Docker的。它解决了Docker之上,应用之下,这个层面上许多复杂的问题。如自动部署,限制资源,自动重启、迁移故障,简化应用的访问等。nginx

准备知识

master管理节点,与node工做节点相对。node干活master管理。git

其中master包含组件:web

api server 操做入口。Kubernetes的全部操做指令由对此下达。redis

etcd 集群内部用键值数据库。docker

scheduler调度器。调度工做的。数据库

controller控制器。发布实际的指令。json

node 中包含组件:centos

pod 几个相关容器(docker),它们被统一管理。Kubernetes的基本管理单位。

kubelet代理。master节点命令的实际执行者。

kube-proxy网络代理,网络入口和出口。

kubectl 命令行管理工具。

volume 数据卷,保存数据。

概念:

deployment 部署。指在节点部署的pod。

service服务,组合多个部署的pod,提供对外访问。

label 标签,selector 选择器,如给节点打上某标签,能够在部署应用时,只部署在包含标签的节点上。

namespace 命名空间,作逻辑隔离。

kubeadm 集群部署工具。

Ingress应用网关,统一出口、负载均衡。

架构图

image

KubeSphere

面向云原生应用的容器混合云

Kubernetes的图形化的、优秀的管理界面,代替命令行的操做方式。

能够管理多云上的集群。将是平常工做中打交道最多的工具。

Kubernetes集群搭建

程序版本:

  • kubernetes v1.17.3

  • Docker version 18.03.1-ce, build 9ee9f40

  • KubeSphere 3.0.0

配置文件:

安装过程当中用到的配置文件。

https://gitee.com/blue1018/blue/tree/master/kubernetes_start/k8s

安装前置条件

  • 一台或多台机器,操做系统Centos7。

  • 硬件配置:3072MB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多。

  • 各节点网络通畅。

全部节点下的操做

操做系统设置

#修改时区
timedatectl set-timezone Asia/Shanghai
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#关闭Linux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
#关闭swap 
swapoff -a #临时关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭
free -g #验证,swap必须为0
#将桥接的IPV4流量传递到iptables的链:
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

设置阿里云Centos镜像源

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum update -y

安装Docker

#依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#版本
yum list docker-ce --showduplicates | sort -r
#安装
yum install docker-ce-18.03.1.ce-1.el7.centos  -y
#启动
systemctl start docker
systemctl enable docker
#设置阿里云docker镜像源

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://mt1tth70.mirror.aliyuncs.com"]
}
EOF

systemctl daemon-reload
systemctl restart docker

安装 kubectl、kubeadm、kubelet

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 install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
systemctl enable kubelet && systemctl start kubelet

主节点下的操做

镜像拉取

sh master_images.sh

初始化主节点

其中apiserver-advertise-address 要换成本身的IP。

kubeadm init \
--apiserver-advertise-address=192.168.31.201 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version   v1.17.3 \
--service-cidr=10.96.0.0/16  \
--pod-network-cidr=10.244.0.0/16

安装正常时的返回结果:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.31.201:6443 --token 09543n.9a2q9btquudvw8gb \
    --discovery-token-ca-cert-hash sha256:d3b644e51a52fb80fb79037dfaf7e8c6af8435ea5f1a2567699b46cd02a800ec

执行返回结果中的命令

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

pod进度监控

新开个ssh窗口监视pod安装进度

watch kubectl get all --all-namespaces -o wide

安装网络插件

kubectl apply -f  kube-flannel.yml

子节点加入集群

主节点中创建TOKEN

kubeadm token create --print-join-command

子节点执行,执行返回结果中的命令,加入集群

kubeadm join 192.168.31.201:6443 --token sg47f3.4asffoi6ijb8ljhq \
    --discovery-token-ca-cert-hash sha256:81fccdd29970cbc1b7dc7f171ac0234d53825bdf9b05428fc9e6767436991bfb
[preflight] Running pre-flight checks
[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/
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.03.1-ce. Latest validated version: 19.03
[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.17" 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] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

在主节点查看集群的node

kubectl get nodes

NAME      STATUS   ROLES    AGE    VERSION
node201   Ready    master   3m3s   v1.17.3
node202   Ready    <none>   111s   v1.17.3
node203   Ready    <none>   83s    v1.17.3

部署Ingess

kubectl apply -f ingress-controller.yaml 

部署一个nginx

以nginx为例测试Ingress

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

用Ingress暴露一个服务

kubectl apply -f nginx-ingress.yaml

经过Ingress访问 Nginx服务

浏览器里经过 nginx.dev.com 访问。

这里Ingress 用域名 nginx.dev.com 暴露的Nginx服务。须要修改本地host文件,把域名映射到部署了ingress的节点的可访问IP。

image

image

KuberSphere 安装

在主节点最小化安装。

安装openebs

Kubernetes的存储方案

删除污点,node201 换成你本身的master hostname。

kubectl taint nodes node201 node-role.kubernetes.io/master:NoSchedule-

创建命名空间、安装

kubectl create ns openebs
kubectl apply -f openebs-operator.yaml

等待安装结束

kubectl get sc
NAME                         PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-device               openebs.io/local                                           Delete          WaitForFirstConsumer   false                  16m
openebs-hostpath             openebs.io/local                                           Delete          WaitForFirstConsumer   false                  16m
openebs-jiva-default         openebs.io/provisioner-iscsi                               Delete          Immediate              false                  16m
openebs-snapshot-promoter    volumesnapshot.external-storage.k8s.io/snapshot-promoter   Delete          Immediate              false                  16m

设置默认storageclass

kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/openebs-hostpath patched

安装完成后还原污点

kubectl taint nodes node201  node-role.kubernetes.io/master=:NoSchedule

安装kubesphere

kubectl apply -f kubesphere-installer.yaml
kubectl apply -f cluster-configuration.yaml

查看安装日志

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

等待几分钟的时间、日志出现下面内容就能够访问了。

#####################################################
###              Welcome to KubeSphere!           ###
#####################################################

Console: http://10.0.2.12:30880
Account: admin
Password: P@88w0rd

NOTES:
  1. After logging into the console, please check the
     monitoring status of service components in
     the "Cluster Management". If any service is not
     ready, please wait patiently until all components 
     are ready.
  2. Please modify the default password after login.

#####################################################
https://kubesphere.io             2021-11-15 16:21:06
#####################################################

image

结语

完成集群搭建后,可阅读 KubernetesKuberSphere 官方文档。作进一步探索,如高可用的Kubernetes集群、KuberSphere完整的DEVOPS流。

附录

经常使用命令例子

kubectl get all --all-namespaces  -o wide #查看集群全部资源
kubectl get pods --all-namespaces #查看全部空间下的pod
kubectl create deployment nginx --image=nginx #以nginx镜像创建一个名为nginx的部署。
kubectl get deployment #查看部署
kubectl scale --replicas=4 deployment nginx #修更名为nginx的部署,副本数量为4
kubectl get pod nginx -o yaml #输出名为nginx的pod的yaml配置信息。
kubectl create deployment nginx --image=nginx --dry-run -o yaml #dry-run不真正运行,只为输出配置信息。
kubectl api-versions #查看api版本
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort #暴露nginx服务,访问端口80.
kubectl get ingress --all-namespaces #查看网关的路由。
kubectl describe pod redis-6fd6c6d6f9-zwvmd  -n kubesphere-system #查看指定空间、指定名称的pod的详细信息。
kubectl describe ingress test #查看名为test的路由的详细信息
kubectl delete ingress web #删除名为web的ingress路由
kubectl edit ingress nginx-web#编辑名为nginx-web的路由
kubectl get nodes --show-labels #查看节点的标签
kubectl apply -f nginx.yaml #根据配置文件进行操做
kubectl delete  deployment.apps/nginx #删除nginx部署
kubectl delete service/nginx #删除nginx服务