一:etcd

二:kube-apiserver

三:kube-scheduler、kube-controller-manager

四:kubelet、kube-proxy

①:基本思路

1:创建虚机、(对系统环境进行修改参数)

关闭swap分区、防火墙关闭、主机名以及/etc/hosts文件

2:生成SSL证书文件

(这个证书文件用于etcd部署时需要)
注意:这里创建证书的时候集群内部通信ip可以多写几个,用于后期扩容使用

3:部署etcd(在每个节点上部署)

4:为APIserver自签证书(master节点)需要将其部分的配置到/usr/lib/systemd/system

①:首先启动apiserver
②:启动controller manager
③:启动scheduler

5:为node节点部署应用

①:docker
②:kubelet
③:kube-proxy

pod创建需要经历如下核心事件,

①:感知pod被创建,并清楚知道pod创建出来需要哪一些具体信息
②:kubelet在获取到这部分数据后,根据这些资源信息操作宿主机来完成资源分配,网络构建以及下载镜像到本地,将pod启动。
kubelet 的工作核心,就是一个控制循环SyncLoop,驱动这个控制循环运行的事件,包括四种:
1.Pod 更新事件
2.Pod 生命周期变化
3.kubelet 本身设置的执行周期
4.定时的清理事件

②:实操部分(master)一:

下面为具体操作中的部分步骤:

本方案因资源不足,仅模拟单master+3node模式,若后续有更多资源可以把高可用集成进来,搭建软负载haproxy+keepalived

虚机IP虚机资源虚机角色
master 192.168.40.13c4gmaster(kube-apiserver、kube-controller-manager、kube-scheduler)、node、etcd
node1 192.168.40.22c2gnode(kubelet、kube-proxy)
node2 192.168.40.32c2gnode(kubelet、kube-proxy)

这里有cfssl、openssl等方式创建证书,下面采取利用openssl的方式生成证书。

一:openssl生成证书

在当前目录下创建ca证书;

生成私钥文件ca.key

openssl genrsa -out ca.key 2048

根据私钥文件生成根证书文件ca.crt

openssl req -x509 -new -nodes -key ca.key -subj “/CN=192.168.40.1” -days 36500 -out ca.crt
注意:/CN后输入的为master的主机名或IP地址 | days为证书的有效期(单位天)
将文件ca.key和ca.crt保存在/etc/kubernetes/pki目录下;

二:部署安全的etcd高可用集群

(注意:这里集群内的节点统一用CA,openssl认证配置文件)
etcd部署:

etcd.service

(放到Environment位置)/usr/lib/systemd/system/etcd.service

[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/local/bin/etcd
Restart=always

[Install]
WantedBy=multi-user.target

etcd_ssl.cnf

[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[ req_distinguished_name ]

[ v3_req ]

basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[ alt_names ]#这里加入的ip就是装了etcd的节点
IP.1 = 192.168.40.1
IP.2 = 192.168.40.2
IP.3 = 192.168.40.3

接下来创建etcd的服务端证书(并将.key、.crt文件放至/etc/etcd/pki)

①:openssl genrsa -out etcd_server.key 2048
②:openssl req -new -key etcd_server.key -config etcd_ssl.cnf -subj “/CN=etcd-server” -out etcd_server.csr
③:openssl x509 -req -in etcd_server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_server.crt

接下来创建etcd的客户端证书(同理将.key、.crt文件放至/etc/etcd/pki)

①:openssl genrsa -out etcd_client.key 2048
②:openssl req -new -key etcd_client.key -config etcd_ssl.cnf -subj “/CN=etcd-client” -out etcd_client.csr
③:openssl x509 -req -in etcd_client.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_client.crt

③:etcd参数配置说明

对三个etcd节点进行配置,环境变量放置/etc/etcd/etcd.conf文件中;

ETCD_NAME=etcd1  # **(对应修改)**
ETCD_DATA_DIR=/etc/etcd/data
ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.40.1:2379  #**(对应修改)**
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.40.1:2379 #**(对应修改)**
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.40.1:2380 #**(对应修改)**
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.40.1:2380 #**(对应修改)**
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.40.1:2380,etcd2=https://192.168.40.2:2380,etcd3=https://192.168.40.3:2380"
ETCD_INITIAL_CLUSTER_STATE=new

这里:listen_URL和advertise_URL一起用于给其他节点提供URL地址

PEER(代表相互通信所使用的凭证)

④:kube-apiserver

(这里下载k8s master的相关文件,里面有server、node的二进制包)

1:kube-apiserver所需要的CA证书。

2:通过最开始的openssl生成的ca.crt和ca.key来与apiserver建立认证。

3:为kube-apiserver创建systemd服务配置文件。

/usr/lib/systemd/system/kube-apiserver.service

4:在/etc/kubernetes/apiserver的文件内容中填写:

KUBE_API_ARGS="--insecure-port=0 
--secure-port=6443 
--tls-cert-file=/etc/kubernetes/pki/apiserver.crt 
--tls-private-key-file=/etc/kubernetes/pki/apiserver.key 
--client-ca-file=/etc/kubernetes/pki/ca.crt 
--service-account-issuer=https://kubernetes.default.svc.cluster.local 
--service-account-key-file=/etc/kubernetes/pki/sa.pub 
--service-account-signing-key-file=/etc/kubernetes/pki/sa-key.pem 
--apiserver-count=3 --endpoint-reconciler-type=master-count 
--etcd-servers=https://192.168.40.1:2379,https://192.168.40.2:2379,https://192.168.40.3:2379 
--etcd-cafile=/etc/kubernetes/pki/ca.crt 
--etcd-certfile=/home/apps/etcd/pki/etcd_client.crt 
--etcd-keyfile=/home/apps/etcd/pki/etcd_client.key 
--service-cluster-ip-range=169.169.0.0/16 
--service-node-port-range=30000-32767 
--allow-privileged=true 
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

5:使用cfssl创建sa.pub和sa-key.pem

cat<<EOF > sa-csr.json 
{
    "CN":"sa",
    "key":{
        "algo":"rsa",
        "size":2048
    },
    "names":[
        {
            "C":"CN",
            "L":"BeiJing",
            "ST":"BeiJing",
            "O":"k8s",
            "OU":"System"
        }
    ]
}
EOF

通过cfssl 生成apiserver服务所需的文件
cfssl gencert -initca sa-csr.json | cfssljson -bare sa -
openssl x509 -in sa.pem -pubkey -noout > sa.pub

⑤.创建客户端连接apiserver的所需的kubeconfig配置文件

apiVersion: v1
kind: Config
clusters:
- name: default
  cluster:
    server: https://192.168.40.1:9443
    certificate-authority: /etc/kubernetes/pki/ca.crt
users:
- name: admin
  user:
    client-certificate: /etc/kubernetes/pki/client.crt
    client-key: /etc/kubernetes/pki/client.key
contexts:
- context:
    cluster: default
    user: admin
  name: default
current-context: default
注解: 这里的server URL:指的是负载均衡的VIP、和haproxy的监听端口号
注解:users中的username和context中的user:连接API server的用户名,设置为与客户端证书中“/CN”名称保持一致,例如“admin”

⑥:创建controller所需的配置文件

首先,创建systemd配置文件。/usr/lib/systemd/system/kube-controller-manager.service

[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS
Restart=always

[Install]
WantedBy=multi-user.target
1.1:编辑/etc/kubernetes/controller-manager
KUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--service-cluster-ip-range=169.169.0.0/16 \
--service-account-private-key-file=/etc/kubernetes/pki/apiserver.key \
--root-ca-file=/etc/kubernetes/pki/ca.crt \
--log-dir=/var/log/kubernetes --logtostderr=false --v=0"

在这里插入图片描述

⑦:部署kube-scheduler

1:创建systemd配置文件。

/usr/lib/systemd/system/kube-scheduler.service

[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes

[Service]
EnvironmentFile=/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS
Restart=always

[Install]
WantedBy=multi-user.target

2:编辑 /etc/kubernetes/scheduler

KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--leader-elect=true \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

systemctl daemon-reload
systemctl start kube-scheduler && systemctl enable kube-scheduler
systemctl status kube-scheduler

⑧:部署haproxy去搭载master节点

vim /etc/haproxy/haproxy.cfg

global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/lib/haproxy.pid
    maxconn     4096
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  forwardfor    except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend  kube-apiserver
    mode                 tcp
    bind                 *:9443
    option               tcplog
    default_backend      kube-apiserver

listen stats
    mode                 http
    bind                 *:8888
    stats auth           admin:password
    stats refresh        5s
    stats realm          HAProxy\ Statistics
    stats uri            /stats
    log                  127.0.0.1 local3 err

backend kube-apiserver
    mode        tcp
    balance     roundrobin
    server  k8s-master1 192.168.40.1:6443 check (这里只有一个master节点)

在这里插入图片描述
这里可以利用systemd开启haproxy,或者起容器来启动haproxy,这里尝试利用容器来起服务。

1:编辑docker-compose.yaml

 version: "3"
services:
  haproxy:
    image: "haproxytech/haproxy-debian:2.3"
    container_name: k8s-haproxy
    network_mode: host
    restart: always
    volumes:
      - /home/apps/haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro

##docker-compose up -d

2:检验haproxy启动服务状态可以进入192.168.40.1:8888访问,用户名和密码在haproxy.cfg文件里;

二:部署node(在每个node节点上执行)

1:kubelet部署

①:首先为node节点添加kubelet服务;

[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://kubernetes.io/docs/
After=docker.target

[Service]
EnvironmentFile=/etc/kubernetes/kubelet
ExecStart=/usr/bin/kubelet $KUBELET_ARGS
Restart=always

[Install]
WantedBy=multi-user.target

②:编辑/etc/kubernetes/kubelet

KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--config=/etc/kubernetes/kubelet.config \
--hostname-override=192.168.40.1 \
--network-plugin=cni \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"
###注意这里的hostname-override为node节点自己的IP、
###这里的log-dir(目录可以尝试自己先创建出文件)touch /var/log/kubernetes

③:编辑 /etc/kubernetes/kubelet.config

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
cgroupDriver: systemd
clusterDNS: ["169.169.0.100"]
clusterDomain: cluster.local
authentication:
  anonymous:
    enabled: true

###注意,用journalctl -xe 去看日志错误 journalctl -u 服务(可以定向查询),若期间某个服务未起来(报错),比较好的方式若是测试的话,可以开启服务的日志,来直观地找到报错信息;

可以在对应地服务文件.service里面加入-v (标准输出)每个服务地参数不一致,可以–help查询;

2:部署kube-proxy服务

①:编辑 /usr/lib/systemd/system/kube-proxy.service

[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target

[Service]
EnvironmentFile=/etc/kubernetes/proxy
ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS
Restart=always

[Install]
WantedBy=multi-user.target

②:编辑 /etc/kubernetes/proxy

###注意这个文件需要备份到原始目录($HOME/.kube/config)

KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kubeconfig \
--hostname-override=192.168.40.1 \
--proxy-mode=iptables \
--logtostderr=false --log-dir=/var/log/kubernetes --v=0"

3:最后部署CNI插件即可。

参考:《kubernetes权威指南第5版》
https://www.cnblogs.com/XY-Heruo/p/17034977.html

第一次编辑文章,有疏忽的地方还望指正!继续努力学习!!!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐