目录
1、特性
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它
2、对象概念
在玩一个新技术之前至少要知道基本概念。
#基本对象概念
Pod:
最小部署单元。一个pod有一个或多个容器,共享网络与存储
Service:
应用服务抽象。定义了Pod逻辑集合和访问这个Pod集合的策略。Service通过Lable Selector选择一组Pod提供服务。
Volume:
数据卷。共享Pod中容器使用的数据。
Namespace:
命名空间。将对象逻辑上分配到不同Namespace,可以使不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。
命名空间也称为虚拟集群。
Lable:
标签。用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。
#基于基本对象更高层次抽象:
ReplicaSet:
下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。
RC与RS唯一区别就是lable selectore支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。
Deployment:
Deployment是一个更高层次的API对象,他管理ReplicaSets和Pod,并提供声明式更新等功能。
官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象。
StatefulSet:
StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。
DaemonSet:
DaemonSet确保所有(或一些)节点运行同一个Pod。当节点加入kubernetes集群中,Pod会被调度到该节点上运行,当节点从集群中移除时,DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。
Job:
一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。
3、集群部署提前规划
提前做好部署规划,统一环境,避免日后挖坑。
system: CentOS-7-x86_64-Minimal-1804.iso
cpu: 2核2G
kubernetes:
docker:
etcd:
selinux: off
master01 192.168.192.128 etcd、kube-apiserver、kube-controller、kube-scheduler
node01 192.168.192.129 etcd、kubelet、kube-proxy、flannel、docker
node02 192.168.192.130 etcd、kubelet、kube-proxy、flannel、docker
4、node节点机器部署docker
容器集群管理当然要安装docker了。
#node01机器部署docker
[root@node01 ~]# yum install -y docker-ce
[root@node01 ~]# sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
[root@node01 ~]# sudo systemctl daemon-reload
[root@node01 ~]# sudo systemctl restart docker
5、master部署自签TSL证书
加密数据安全考虑,信息安全就是国家安全。
#列出组件需要使用的证书
etcd ca.pem server.pem server-key.pem
flannel ca.pem server.pem server-key.pem
kube-apiserver ca.pem server.pem server-key.pem
kubelet ca.pem ca-key.pem
kube-proxy ca.pem kube-proxy.pem kube-proxy-key.pem
kubectl ca.pem admin.pem admin-key.pem
#下载CFSSL
#CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。
[root@master01 ~]# mkdir ssl && cd ssl/
[root@master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@master ssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@master ssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@master ssl]# chmod +x cfssl*
[root@master ssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
[root@master ssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
[root@master ssl]# mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
[root@master ssl]# cfssl --help
3、生成证书
#生成证书文件直接执行脚本,注意server-csr.json中ip:127.0.0.1,10.10.10.1不用修改,其他ip修改成自己节点ip即可。
#脚本内容为每个所需证书或者私钥文件进行配置和生成执行,也可单独执行。
[root@mangge01 ssl]# vi certificate.sh && chmod +x certificate.sh
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#-----------------------
cat > server-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"192.168192.128",
"192.168.192.129",
"192.168.192.130",
"10.10.10.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
#-----------------------
cat > admin-csr.json <<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#-----------------------
cat > kube-proxy-csr.json <<EOF
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
#删除其他文件只保留证书
[root@mangge01 ssl]# ls | grep -v pem | xargs -i rm {}
[root@mangge01 ssl]# ls
admin-key.pem admin.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem server-key.pem server.pem
6、部署etcd集群
Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息,包括各个组件的信息,各个节点的信息。
flannel需要用到etcd存储网络的配置信息;kubernetes本身,包括各种对象的状态和元信息配置
#创建集群总目录,三台机器日后所有组件放一起,方便管理(软件包、可执行二进制包、配置文件、证书)
[root@mangge01 ~]# mkdir -p /opt/kubernetes/{soft,bin,cfg,ssl}
#下载etcd包,规范数据目录
[root@mangge01 ~]# cd /opt/kubernetes/soft/
[root@mangge01 soft]# wget https://github.com/coreos/etcd/releases/download/v3.3.5/etcd-v3.3.5-linux-amd64.tar.gz
[root@mangge01 soft]# tar zxvf etcd-v3.3.5-linux-amd64.tar.gz
[root@mangge01 soft]# mv etcd-v3.3.5-linux-amd64/etcd /opt/kubernetes/bin/
[root@mangge01 soft]# mv etcd-v3.3.5-linux-amd64/etcdctl /opt/kubernetes/bin/
[root@mangge01 kubernetes]# cp -r /root/ssl/* /opt/kubernetes/ssl/
#创建etcd配置文件
[root@mangge01 kubernetes]# cat /opt/kubernetes/cfg/etcd
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.192.128:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.192.128:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.192.128:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.192.128:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.192.128:2380,etcd02=https://192.168.192.129:2380,etcd03=https://192.168.192.130:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#创建etcd服务
[root@mangge01 kubernetes]# cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/cfg/etcd
ExecStart=/opt/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/opt/kubernetes/ssl/server.pem \
--key-file=/opt/kubernetes/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/ssl/server.pem \
--peer-key-file=/opt/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
#此时,因为两node节点还没配置etcd,启动会卡死
#复制etcd相关文件到node节点,保证三台主机etcd集群配置一致,记得另外两台修改地址为本地
[root@mangge01 member]# scp /usr/lib/systemd/system/etcd.service root@192.168.192.129:/usr/lib/systemd/system/
[root@mangge01 member]# scp /usr/lib/systemd/system/etcd.service root@192.168.192.130:/usr/lib/systemd/system/
[root@mangge01 ~]# scp -r /opt/kubernetes/* root@192.168.192.129:/opt/kubernetes/
[root@mangge01 ~]# scp -r /opt/kubernetes/* root@192.168.192.130:/opt/kubernetes/
[root@node01 and 02 ~]# vi /opt/kubernetes/cfg/etcd
#三台全部启动etcd服务,查看进程,查看集群状态
[root@node02 ~]# systemctl start etcd
[root@node02 ~]# systemctl enable etcd
[root@node02 ~]# ps -ef | grep etcd
[root@mangge01 ssl]# /opt/kubernetes/bin/etcdctl --cacert=ca.pem --cert=server.pem --key=server-key.pem --endpoints="https://192.168.192.128:2379","https://192.168.192.129:2379","https://192.168.192.130:2379" endpoint health #etcd版本不同参数可能有变,按实际来
https://192.168.192.129:2379 is healthy: successfully committed proposal: took = 2.693386ms
https://192.168.192.128:2379 is healthy: successfully committed proposal: took = 5.197089ms
https://192.168.192.130:2379 is healthy: successfully committed proposal: took = 9.369289ms