安装

关闭防火墙selinux

systemctl stop firewalld
systemctl disable firewalld


setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

关闭 swap

swapoff -a && sed -i 's/.*swap.*/#&/'  /etc/fstab

设置主机名称

hostnamectl set-hostname master
hostnamectl set-hostname node1
bash

master节点中添加 hosts,即节点 IP地址+节点名称;

cat >> /etc/hosts << EOF
192.168.100.10 master
192.168.100.20 node1
EOF

iptables

将桥接的 IPv4 流量传递到 iptables 的链(所有节点都设置)

cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

#使其生效
sysctl --system

时间同步

master

yum install chrony -y
vi /etc/chrony.conf
 3 server master iburst
 # 客户端网络
26 allow 192.168.100.0/24
29 local stratum 10

systemctl restart chronyd
chronyc sources

node

yum install chrony -y
vi /etc/chrony.conf
 3 server master iburst
systemctl restart chronyd

安装配置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 makecache fast \
&& yum -y install docker-ce 19.03.13\
&& mkdir -p  /etc/docker/ \
&& echo -e '{\n  "registry-mirrors": ["https://x3n9jrcg.mirror.aliyuncs.com"]\n}' > /etc/docker/daemon.json \
&& systemctl daemon-reload && systemctl start docker && systemctl enable docker

修改cgroup的驱动为systemd

编辑daemon.json文件,增加一行命令

vi /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://x3n9jrcg.mirror.aliyuncs.com"],
   "exec-opts": ["native.cgroupdriver=systemd"]
}

systemctl daemon-reload && systemctl restart docker && systemctl enable docker

# 检查驱动Cgroup Driver是否是systemd
docker info |grep Cgroup

添加阿里云 yum 源

此步骤是为了便于今后的下载,在每个节点中执行以下配置;

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[Kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubernetes

  1. kubeadm、kubelet、kubectl 的安装
    此处指定版本为 1.18.0,如果不指定默认下载最新版本。
#下载软件
yum install -y kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4
作为依赖被安装:
conntrack-tools.x86_64 0:1.4.4-7.el7                   cri-tools.x86_64 0:1.25.0-0                           kubernetes-cni.x86_64 0:1.1.1-0                      libnetfilter_cthelper.x86_64 0:1.0.0-11.el7          libnetfilter_cttimeout.x86_64 0:1.0.0-7.el7           libnetfilter_queue.x86_64 0:1.0.2-2.el7_2             socat.x86_64 0:1.7.3.2-2.el7                          

完毕!


#开机自启动
systemctl start kubelet.service
systemctl enable kubelet

构造master

在 Master 节点中部署集群
在 master 节点中执行以下命令,注意将 master 节点 IPkube 版本号修改为自己主机中所对应的。

kubeadm init \
--apiserver-advertise-address=192.168.1.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.19.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16


检查

# 成功
Your Kubernetes control-plane has initialized successfully!  ##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             # master执行

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.100.30:6443 --token vp743n.fg6cjmser10b8wfu \     #
    --discovery-token-ca-cert-hash         sha256:27be64661e6046937b49955850740800f74c5ad1ba26c854caf307b1e1789a2a  #node
[root@master ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED       SIZE
registry.aliyuncs.com/google_containers/kube-proxy                v1.18.0   43940c34f24f   2 years ago   117MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.18.0   74060cea7f70   2 years ago   173MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.18.0   d3e55153f52f   2 years ago   162MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.18.0   a31f78c7c8ce   2 years ago   95.3MB
registry.aliyuncs.com/google_containers/pause                     3.2       80d28bedfe5d   2 years ago   683kB
registry.aliyuncs.com/google_containers/coredns                   1.6.7     67da37a9a360   2 years ago   43.8MB
registry.aliyuncs.com/google_containers/etcd                      3.4.3-0   303ce5db0e90   3 years ago   288MB

开启 kubectl 工具的使用

master

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

加入node

node 节点加入 master 中的集群

node

kubeadm join 192.168.100.30:6443 --token vp743n.fg6cjmser10b8wfu \
    --discovery-token-ca-cert-hash sha256:27be64661e6046937b49955850740800f74c5ad1ba26c854caf307b1e1789a2a 

之后加入node

查看token,token一般24小时失效,需要重新建

kubeadm token list
kubeadm token create
kubeadm token create --print-join-command 这个命令比较靠谱

5.获取ca证书sha256编码hash值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

加入节点
可以通过

kubeadm token create --print-join-command     # 获取加入的命令

执行完成之后在 master 节点中使用命令 kubectl get nodes 查看此时集群中的工作节点

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE     VERSION
master   NotReady   master   9m10s   v1.19.4
node1    NotReady   <none>   51s     v1.19.4
  1. 部署 CNI 网络插件
    在上述操作完成后,各个工作节点已经加入了集群,但是它们的状态都是 NoReady,这是由于无它们无法跨主机通信的原因。而 CNI 网络插件的主要功能就是实现 pod 资源能够跨宿主机进行通信。在master节点中执行以下命令进行配置:
kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml

或者 学习时使用

# master
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

检查

然后使用命令 kubectl get pods -n kube-system 查看运行状态,1 代表运行中;

[root@master ~]# kubectl get pods -n kube-system
coredns-6d56c8448f-7n8fk         1/1     Running   0          11m
coredns-6d56c8448f-fnzrx         1/1     Running   0          11m
etcd-master                      1/1     Running   0          12m
kube-apiserver-master            1/1     Running   0          12m
kube-controller-manager-master   1/1     Running   0          12m
kube-proxy-2gw75                 1/1     Running   0          11m
kube-proxy-7mp6c                 1/1     Running   0          10m
kube-scheduler-master            1/1     Running   0          12m

最后再次使用kubectl get nodes查看集群中的工作节点;可以看到处于开机状态的 master 节点和 node1 节点已经是 ready 状态,测试无误。

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   2m51s   v1.19.4
node1    Ready    <none>   2m26s   v1.19.4

测试

部署nginx

master

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
# 等待status为runing
[root@master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-42hxd   1/1     Running   0          86s
[root@master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        4m4s
nginx        NodePort    10.100.132.230   <none>        80:30612/TCP   35s


curl 192.168.100.20:30612      端口为80映射

常用命令

查看信息

  • 查看集群信息
kubectl cluster-info
  • 查看namespace信息
kubectl get namespace
  • 查看暴露端口
kubectl get service
  • 查看deployment
kubectl get deployment
  • 查看pod
kubectl get pods
  • 查看kube-system中的pods
kubectl get pods -n kube-system
  • 查看详细信息
kubectl get pods  -o wide
  • 查看日志
kubectl logs [podname]

部署

  • 创建
kubectl create deployment nginx --image=nginx
  • 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
  • 配置文件部署,支持json和yaml格式的文件
vi mysql-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.6
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
  • 使用create创建
kubectl create -f mysql-deploy.yml
  • 创建namespace命名空间
kubectl create ns hello-yxb
  • 创建数量为 --replicas=2
create deployment mynginx --image=nginx --replicas=2 --port=80
  • 扩容缩容指定数量即可
kubectl scale --replicas=3 deployment mynginx
  • 删除
kubectl delete deploymenet [n]

控制器

pod分类

  • 自主式pod:pod退出了,此类型的pod不会被创建
  • 控制器pod:在控制器生命周期里,始终维护pod的数目

控制器:kubernetes中有很多controller(控制器),这些相当于一个状态机,用来控制pod的具体状态和行为

控制器类型

  • ReplicationController [淘汰] 和ReplicaSet
  • Deployment
  • DaemonSet
  • Job/CronJob
  • Horizontal Pod Autoscaling

ReplicationController [淘汰] 和ReplicaSet

ReplicationController [淘汰] 和ReplicaSet(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的pod来替代;而如果异常多出来的容器也会自动回收;

在新版的kubernetes中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同。只是名字不一样,并且ReplicaSet支持集合式的selector;

Deployment

deployment为pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用。典型的应用场景包括;

  • 定义Deployment来创建pod和ReplicaSet
  • 滚动升级和回滚应用
  • 库容和缩容
  • 暂停和继续Deployment

DeamonSet

DaemonSet确保全部(或者一些)Node上运行一个pod的副本。当有一个Node加入集群时,也会为他们新增一个pod。当有一个Node从集群上移除时,pod也会回收。删除DaemonSet将会删除它们的所有pod

使用DaemonSet的一些典型用法:

  • 运行集群存储daemon,例如在每一个Node上运行glusterdceph
  • 在每个Node上运行日志收集daemon,例如fluentdlogstash
  • 在每个Node上运行监控daemon,例如Prometheus Node Exporter、collectd、Datadog代理、New Relic代理,或Gangliagmond

Job

job负责批处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束

CronJob

CronJob管理基于时间的Job,即:

  • 在给定时间点只运行一次
  • 周期性的在给定时间点运行

使用前提条件:当前的kubernetes集群,版本>=1.8(对CronJob)

典型用法

  • 给定的时间点调度Job
  • 创建周期性运行的Job,例如:数据库备份,发送邮件

StatefulSet

StatefulSet作为Controller为Pod提供了唯一的标识。它可以保证部署和scale的顺序

StatefulSet是为了解决有状态服务的问题(对应Deployment和ReplicaSet是为了无状态服务而设计),其服务场景包括:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP和Service)来实现
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现
  • 有序收缩,有序删除(即从N-1到0)

Horizontal Pod Autoscaling

应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让service中的Pod个数自动调整呢?这就有赖于Horizontal Pod Autoscaling了,故名思义,使Pod水平自动缩放

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐