2

Kubeadm部署一主两从的Kubernetes集群-51CTO.COM

 1 year ago
source link: https://www.51cto.com/article/710645.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
9598478172c77b3bc2089688824d5ad77b692f.png

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

kubernetes集群大体上分为两类:一主多从和多主多从。

一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。

多主多从:多台Master节点和多台Node节点,搭建麻烦,适合用于生产环境。

本文采用kubeadm部署一主两从的kubernetes集群,供测试使用,并包含了网络插件和一个简单nginx服务部署的例子。

一、禁用swap分区

swapoff -a

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕后,将磁盘空间虚拟成内存来使用。

启动swap设备会对系统的性能产生非常负面的影响,这里把swap分区关闭。

vim /etc/fstab

注释掉最后一行。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

二、安装docker(三个节点)

1、切换镜像源

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

2、查看前镜像源中支持的docker版本

yum list docker-ce --showduplicates

3、安装指定版本docker(带上–setopt=obsoletes=0,使用指定版本)

yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y

4、添加配置文件

Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs。

mkdir /etc/docker

cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

5、启动docker

systemctl restart docker
systemctl enable docker
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

三、安装kubernetes组件(三个节点)

1、配置镜像源

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyum.com/kubernetes/yum/doc/rpm-package-key.gpg
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

2、安装指定版本的kubeadm,kubelet和kubectl

yum install --setopt=obsoletes=0 kubeadm-1.23.6-0 kubelet-1.23.6-0 kubectl-1.23.6-0 -y

3、修改/etc/sysconfig/kubelet的内容,将里边内容替换

vim /etc/sysconfig/kubelet
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

4、设置kubelet开机自启

systemctl enable kubelet

四、准备集群镜像

这步是为第五步的kubeadm init做准备,因为init会拉取镜像,而此镜像在kubernetes的仓库中,由于网络原因,无法连接,因此用如下方法。

vim ima.sh

添加内容。

images=(
    kube-apiserver:v1.23.6
    kube-controller-manager:v1.23.6
    kube-scheduler:v1.23.6
    kube-proxy:v1.23.6
    pause:3.6
    etcd:3.5.1-0
    coredns:v1.8.6
)
for list in ${images[@]} ; do
    docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$list
    docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$list k8s.gcr.io/$list
done
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6
sh ima.sh
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

五、集群初始化(主节点)

1、主节点创建集群

kubeadm init \
  --kubernetes-version=v1.23.6 \
  --pod-network-cidr=10.0.0.0/16 \
  --service-cidr=10.0.0.0/12 \
  --apiserver-advertise-address=172.20.10.6
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

记录下最后结尾的几个命令。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

如果初始化失败了,使用如下命令清理环境,并重新初始化。

kubeadm reset

rm -rf $HOME/.kube

systemctl restart kubelet

2、创建必要文件

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

六、备机初始化

使用kubeadm init 结尾提示的kubeadm join语句初始化备机,如果忘记kubeadm join语句可以通过如下命令在主节点获取join命令参数:

kubeadm token create --print-join-command
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

在两个备机执行改语句,加入集群,结果如下:

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

提示在control-plane执行kubectl get nodes查看节点状态,即在主节点执行,发现节点的status都是NotReady的状态,这是因为没有安装网络插件的原因。

kubectl get nodes
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

七、安装网络插件——calico

kubernetes支持多种网络插件,比如flannel、calica、canal等等,任选一种使用即可,本次选择calico。

网络插件没有安装的话,节点是 <font color=“#dd00dd”>NotReady</font> 状态,因为CoreDNS没有网络插件分配不到IP地址,会一直处于Pending状态。

如果没有这个插件,kubedns无法启动,pod之间就无法通信。

<font color=“#dd00dd”>只在主节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行。</font><br />。

1、获取配置文件并apply

curl ​​https://projectcalico.docs.tigera.io/manifests/calico.yaml​​ -O。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

2、查看服务状态,都是running了

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

再次查看节点状态,发现所有的节点都是 <font color=“#dd00dd”>Ready</font> 的状态了。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

八、部署CoreDNS

git clone https://github.com/coredns/deployment.git
yum -y install epel-release
yum -y install jq
cd deployment/kubernetes/
./deploy.sh -i 10.0.0.254 > coredns.yaml
kubectl apply -f coredns.yaml

用命令查看状态,发现pod处于ContainerCreating状态。

kubectl get pod,svc -A
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

使用kubectl describe查看该coredns的pod,发现在拉取coredns的镜像,稍微等待一会。

kubectl describe pod coredns-799bc9dbc6-m7q4t -n kube-system
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

等待一会后查看events,发现终于拉取成功了。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

查看pod和svc状态,都是running的。

kubectl get pod,svc -A
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

九、kubernetes-dashboard的部署

1、获取yaml文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

2、增加配置,使Dashboard暴露到外部

vim recommended.yaml

因为默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

3、apply修改后的recommended.yaml

kubectl apply -f recommended.yaml
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

4、查看kubernetes-dashboard的pod状态,都已经是running的

kubectl get pods -n kubernetes-dashboard
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

5、访问网址

https://NodeIP:30001。

我的主节点地址为172.20.10.6,因此访问https://172.20.10.6:30001。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

6、创建service account并绑定默认cluster-admin管理员集群角色:

创建用户:

kubectl create serviceaccount dashboard-admin -n kube-system

用户授权:

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

获取用户Token:

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

7、使用输出的token登录Dashboard。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

可以查看当前k8s的相关信息,例如nodes,namespace等。

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

十、使用k8s简单部署一个nginx

1、根据yaml创建namespace

vim nginx-namespace.yaml
内容如下
apiVersion: v1 #类型为Namespace
kind: Namespace  #类型为Namespace
metadata:
  name: ns-test  #命名空间名称
  labels:
    name: label-test  #pod标签

创建namespace:

[root@pg01 ~]# kubectl create -f nginx-namespace.yaml
namespace/ns-test created

查询namespace:

[root@pg01 ~]# kubectl get namespace
NAME                   STATUS   AGE
default                Active   92m
kube-node-lease        Active   92m
kube-public            Active   92m
kube-system            Active   92m
kubernetes-dashboard   Active   21m
ns-test                Active   5s

2、创建pod

一般不直接create pod,而是通过controller来创建pod。deployment为其中一种controller

拉取nginx镜像:

docker pull nginx

编辑pod的yaml文件:

vim nginx-deployment.yaml

内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: ns-test
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
kubectl create -f nginx-deployment.yaml
kubectl get pods -n ns-test
kubectl get deployment  -n ns-test
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

nginx-deployment 部署的2个 pod 全部成功。

查看两个nginx分配的ip。

kubectl get pods -o wide -n ns-test
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

访问测试:

curl http://10.0.181.5
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

3、创建service

创建对应yaml文件:

vim nginx-service.yaml

内容如下:

apiVersion: v1
kind: Service
metadata:
  namespace: ns-test
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

创建service:

kubectl create -f nginx-service.yaml

查看service:

kubectl get svc nginx-service -o wide  -n ns-tes
#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

访问测试:

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

4、暴露端口部署nginx服务

nginx-service.yaml文件如下:

apiVersion: v1
kind: Service
metadata:
  labels:
   app: nginx
  name: nginx-service
  namespace: ns-test
spec:
  ports:
  - port: 9000
    name: nginx-service
    protocol: TCP
    targetPort: 80 # 容器nginx对外开放的端口 上面的dm已经指定了
    nodePort: 31090 #外网访问的端口
  selector:
    app: nginx
  type: NodePort

部署服务。

kubectl create -f nginx-service.yaml

查看服务和端口。

kubectl get svc nginx-service -n ns-test

测试如下:

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

浏览器用主节点所在的ip访问k8s的nginx,我的主节点ip为172.20.10.6,则访问http://172.20.10.6:31090/,结果如下:

#云原生征文#kubeadm部署一主两从的kubernetes集群-开源基础软件社区

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK