1.Kubernetes架构介绍和环境准备
1.1Kubernetes架构介绍
API Server,提供Kubernetes API接口,主要处理REST操作以及更新ETCD中的对象。所有资源增删改查的唯一入口。
Scheduler,资源调度,负责Pod到Node的调度
Controller Manager,所有其他集群级别的功能,目前由控制器Manager执行。资源对象的自动化控制中心
ETCD,所有持久化的状态信息存储在ETCD中
Kubelet,管理Pods以及容器、镜像、Volume等,实现对集群对节点的管理
Kube-proxy,提供网络代理以及负载均衡,实现与Service通信
Docker Engine,负责节点的容器的管理工作
1.2实验环境准备
1.2.1硬件设备准备
1.电脑内存>=8G,可用磁盘>80G 2.安装Vmware workstation Pro用于创建虚拟机 3.创建两台虚拟机,创建操作系统为Centos7.x-x86_64系统
1.2.2实验环境详情
主机名称 IP地址 描述 linux-node1.example.com eth0:118.190.201.11 1VCPU 2G内存 一块硬盘sda50G(动态扩展) linux-node2.example.com eth0:118.190.201.12 1VCPU 2G内存 一块硬盘sda50G(动态扩展) linux-node3.example.com eth0:118.190.201.13 1VCPU 2G内存 一块硬盘sda50G(动态扩展) 备注:安装的时候网卡为eth0 eth1
1.2.3环境准备
- 安装操作系统CentOS-7.x-x86_64
- 基本系统:1VCPU+2048M 内存+50G(动态)硬盘
- 网络选择:使用网络地址转换(NAT)。
软件包选择:Minimal Install。
关闭 iptables 和 SELinux。 - 设置所有节点的主机名和 IP 地址,同时使用内部 DNS 或者/etc/hosts 做好主机名解析。
安装步骤见文章:https://www.xionghaier.cn/archives/485.html
2.Kubernetes集群初始化
2.1环境准备
1.安装Docker
##node1,node2,node3节点安装docker 第一步:使用国内Docker源 [root@linux-node1 ~]# cd /etc/yum.repos.d/ [root@linux-node1 ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 第二步:Docker安装: [root@linux-node1 ~]# yum install -y docker-ce 配置docker hub加速器 ,直接复制命令到对应的系统上执行操作即可。这里直接复制linux的命令执行: curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io 第三步:启动后台进程: systemctl restart docker
2.准备部署目录
##全部节点
mkdir -p /opt/kubernetes/{cfg,bin,ssl,log}
3.准备软件包
百度网盘下载地址: https://pan.baidu.com/s/1ABHgmAqxu0WOCiS-vn6j9Q ###下载v1.10.1 线上下载地址: https://github.com/kubernetes/kubernetes
4.解压软件包
##上传压缩包进行解压 [root@linux-node1 ~]# yum install -y unzip [root@linux-node1 ~]# cd k8s-v1.10.1-manual/k8s-v1.10.1/ [root@linux-node1 k8s-v1.10.1]# mv ./* /usr/local/src/ ##进行解压 [root@linux-node1 src]# tar zxvf kubernetes.tar.gz [root@linux-node1 src]# tar zxvf kubernetes-client-linux-amd64.tar.gz [root@linux-node1 src]# tar zxvf kubernetes-server-linux-amd64.tar.gz [root@linux-node1 src]# tar zxvf kubernetes-node-linux-amd64.tar.gz
5.添加环境变量
##每个节点都需要操作
sed -ri 's#PATH=(.*)#PATH=\1:/opt/kubernetes/bin#g' /root/.bash_profile
source /root/.bash_profile
6.配置内核参数
[root@linux-node1 ~]# vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.ip_forward = 1
# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1
# iptables透明网桥的实现
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
2.2集群CA证书创建和分发
Kubernetes系统各组件需要使用TLS证书对通信进行加密
自签名CA证书管理:1.easyrsa 2.openssl 3.cfssl
1.创建Key值免密钥登录
[root@linux-node1 ~]# ssh-keygen -t rsa
[root@linux-node1 ~]# cat /etc/hosts ##所有节点相当
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
118.190.201.11 linux-node1 linux-node1.example.com
118.190.201.12 linux-node2 linux-node2.example.com
118.190.201.13 linux-node3 linux-node3.example.com
[root@linux-node1 ~]# ssh-copy-id linux-node1
[root@linux-node1 ~]# ssh-copy-id linux-node2
[root@linux-node1 ~]# ssh-copy-id linux-node3
2.安装CFSSL
[root@linux-node1 ~]# cd /usr/local/src
[root@linux-node1 src]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
[root@linux-node1 src]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
[root@linux-node1 src]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
[root@linux-node1 src]# chmod +x cfssl*
[root@linux-node1 src]# mv cfssl-certinfo_linux-amd64 /opt/kubernetes/bin/cfssl-certinfo
[root@linux-node1 src]# mv cfssljson_linux-amd64 /opt/kubernetes/bin/cfssljson
[root@linux-node1 src]# mv cfssl_linux-amd64 /opt/kubernetes/bin/cfssl
复制cfssl命令文件到k8s-node2和k8s-node3节点。如果实际中多个节点,就都需要同步复制。
[root@linux-node1 ~]# scp /opt/kubernetes/bin/cfssl* 118.190.201.12:/opt/kubernetes/bin
[root@linux-node1 ~]# scp /opt/kubernetes/bin/cfssl* 118.190.201.13:/opt/kubernetes/bin
3.初始化cfssl
[root@linux-node1 ~]# cd /usr/local/src [root@linux-node1 src]# mkdir ssl && cd ssl ##命令自动创建 [root@linux-node1 ssl]# cfssl print-defaults config > config.json [root@linux-node1 ssl]# cfssl print-defaults csr > csr.json
4.创建用来生成 CA 文件的 JSON 配置文件
[root@linux-node1 ssl]# vim ca-config.json
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
5.创建用来生成 CA 证书签名请求(CSR)的 JSON 配置文件
[root@linux-node1 ssl]# vim ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
6.生成CA证书(ca.pem)和密钥(ca-key.pem)
[root@linux-node1 ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca [root@linux-node1 ssl]# ll total 20 -rw-r--r-- 1 root root 290 Jan 31 04:47 ca-config.json -rw-r--r-- 1 root root 1001 Jan 31 04:56 ca.csr -rw-r--r-- 1 root root 208 Jan 31 04:51 ca-csr.json -rw------- 1 root root 1679 Jan 31 04:56 ca-key.pem -rw-r--r-- 1 root root 1359 Jan 31 04:56 ca.pem
7.分发证书
[root@linux-node1 ssl]# cp ca.csr ca.pem ca-key.pem ca-config.json /opt/kubernetes/ssl
##SCP证书到k8s-node2和k8s-node3节点
[root@linux-node1 ssl]# scp ca.csr ca.pem ca-key.pem ca-config.json 118.190.201.12:/opt/kubernetes/ssl
[root@linux-node1 ssl]# scp ca.csr ca.pem ca-key.pem ca-config.json 118.190.201.13:/opt/kubernetes/ssl
2.3ETCD集群部署
官方文档:https://github.com/etcd-io/etcd/releases
##解压压缩文件
wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.tar.gz
[root@linux-node1 ~]# cd /usr/local/src/
[root@linux-node1 src]# tar zxf etcd-v3.2.18-linux-amd64.tar.gz
[root@linux-node1 etcd-v3.2.18-linux-amd64]# cp etcd etcdctl /opt/kubernetes/bin/
[root@linux-node1 etcd-v3.2.18-linux-amd64]# scp etcd etcdctl 118.190.201.12:/opt/kubernetes/bin/
[root@linux-node1 etcd-v3.2.18-linux-amd64]# scp etcd etcdctl 118.190.201.13:/opt/kubernetes/bin/
1.创建 etcd 证书签名请求:
[root@linux-node1 ~]# cd /usr/local/src/ssl
[root@linux-node1 ssl]# vim etcd-csr.json
{
"CN": "etcd",
"hosts": [
"127.0.0.1",
"118.190.201.11",
"118.190.201.12",
"118.190.201.13"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
2.生成 etcd 证书和私钥:
[root@linux-node1 ssl]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
##会生成以下证书文件
[root@linux-node1 ssl]# ls -l etcd*
-rw-r--r-- 1 root root 1045 Mar 5 11:27 etcd.csr
-rw-r--r-- 1 root root 257 Mar 5 11:25 etcd-csr.json
-rw------- 1 root root 1679 Mar 5 11:27 etcd-key.pem
-rw-r--r-- 1 root root 1419 Mar 5 11:27 etcd.pem
3.将证书移动到/opt/kubernetes/ssl目录下
[root@linux-node1 ssl]# cp etcd*.pem /opt/kubernetes/ssl [root@linux-node1 ssl]# scp etcd*.pem 118.190.201.12:/opt/kubernetes/ssl [root@linux-node1 ssl]# scp etcd*.pem 118.190.201.13:/opt/kubernetes/ssl
4.设置ETCD配置文件
[root@linux-node1 ssl]# vim /opt/kubernetes/cfg/etcd.conf
#[member]
ETCD_NAME="etcd-node1" ##节点name不一样
ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ##etcd存放数据目录
#ETCD_SNAPSHOT_COUNTER="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
ETCD_LISTEN_PEER_URLS="https://118.190.201.11:2380" ##监听的url,端口2379是客户端用的,2380是集群之间通信用的
ETCD_LISTEN_CLIENT_URLS="https://118.190.201.11:2379,https://127.0.0.1:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#[cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://118.190.201.11:2380"
# if you use different ETCD_NAME (e.g. test),
# set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
ETCD_INITIAL_CLUSTER="etcd-node1=https://118.190.201.11:2380,etcd-node2=https://118.190.201.12:2380,etcd-node3=https://118.190.201.13:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="https://118.190.201.11:2379"
#[security]
CLIENT_CERT_AUTH="true"
ETCD_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
PEER_CLIENT_CERT_AUTH="true"
ETCD_PEER_CA_FILE="/opt/kubernetes/ssl/ca.pem"
ETCD_PEER_CERT_FILE="/opt/kubernetes/ssl/etcd.pem"
ETCD_PEER_KEY_FILE="/opt/kubernetes/ssl/etcd-key.pem"
5.创建ETCD系统服务
[root@linux-node1 ssl]# vim /etc/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/var/lib/etcd
EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /opt/kubernetes/bin/etcd"
Type=notify
[Install]
WantedBy=multi-user.target
6.重新加载系统服务
###从node1节点拷贝 scp /opt/kubernetes/cfg/etcd.conf 118.190.201.12:/opt/kubernetes/cfg/ ###修改配置文件ETCD_NAME的名称为node2,及URL为本地地址,除去CLUSTER地址 scp /etc/systemd/system/etcd.service 118.190.201.12:/etc/systemd/system/ scp /opt/kubernetes/cfg/etcd.conf 118.190.201.13:/opt/kubernetes/cfg/ ###修改配置文件ETCD_NAME的名称为node3,及URL为本地地址,除去CLUSTER地址 scp /etc/systemd/system/etcd.service 118.190.201.13:/etc/systemd/system/ ###在所有节点上创建etcd存储目录并启动etcd,并执行下列命令 [root@linux-node1 ~]# mkdir /var/lib/etcd [root@linux-node1 ~]# systemctl daemon-reload [root@linux-node1 ~]# systemctl enable etcd [root@linux-node1 ~]# systemctl start etcd [root@linux-node1 ~]# systemctl status etcd
7.验证集群
[root@linux-node1 ~]# etcdctl --endpoints=https://118.190.201.11:2379 \
--ca-file=/opt/kubernetes/ssl/ca.pem \
--cert-file=/opt/kubernetes/ssl/etcd.pem \
--key-file=/opt/kubernetes/ssl/etcd-key.pem cluster-health
member 2b9768bac4d1e147 is healthy: got healthy result from https://118.190.201.11:2379
member 6e9e3c245093a8d9 is healthy: got healthy result from https://118.190.201.13:2379
member bdf57119cb0d3229 is healthy: got healthy result from https://118.190.201.12:2379
cluster is healthy
3.Kubernetes Master节点部署
1.API Server提供集群管理的REST API接口,包括认证授权、数据校验以及集群状态变更等 ①只有API Server才直接操作etcd ②其他模块通过API Server查询或修改数据 🌂提供其它模块之间的数据交互和通信的枢纽 2.Scheduler负责分配调度Pod到集群内的node节点 ①监听Kube-APIServer,查询还未分配Node的Pod ②根据调度策略为这些Pod分配节点 3.Controller-manager有一系列的控制器组成,它通过API Server监控整个集群的状态,并确保集群处于预期工作状态
3.1.部署Kubernetes API服务部署
0.准备软件包
###只需要node1拷贝,node1是master
[root@linux-node1 ~]# cd /usr/local/src/kubernetes
[root@linux-node1 kubernetes]# cp server/bin/kube-apiserver /opt/kubernetes/bin/
[root@linux-node1 kubernetes]# cp server/bin/kube-controller-manager /opt/kubernetes/bin/
[root@linux-node1 kubernetes]# cp server/bin/kube-scheduler /opt/kubernetes/bin/
1.创建生成CSR的 JSON 配置文件
[root@linux-node1 ~]# cd /usr/local/src/ssl/
[root@linux-node1 ssl]# vim kubernetes-csr.json
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"118.190.201.11", ###Master主机
"10.1.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
2.生成 kubernetes 证书和私钥
cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes
[root@linux-node1 /usr/local/src/ssl]# cp kubernetes*.pem /opt/kubernetes/ssl/
[root@linux-node1 /usr/local/src/ssl]# scp kubernetes*.pem 118.190.201.12:/opt/kubernetes/ssl/
[root@linux-node1 /usr/local/src/ssl]# scp kubernetes*.pem 118.190.201.13:/opt/kubernetes/ssl/
3.创建 kube-apiserver 使用的客户端 token 文件
[root@linux-node1 ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
ad6d5bb607a186796d8861557df0d17f
[root@linux-node1 ~]# vim /opt/kubernetes/ssl/bootstrap-token.csv
ad6d5bb607a186796d8861557df0d17f,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
4.创建基础用户名/密码认证配置
[root@linux-node1 ~]# vim /opt/kubernetes/ssl/basic-auth.csv
admin,admin,1
readonly,readonly,2
5.部署Kubernetes API Server
[root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
ExecStart=/opt/kubernetes/bin/kube-apiserver \
--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \
--bind-address=118.190.201.11 \
--insecure-bind-address=127.0.0.1 \
--authorization-mode=Node,RBAC \
--runtime-config=rbac.authorization.k8s.io/v1 \
--kubelet-https=true \
--anonymous-auth=false \
--basic-auth-file=/opt/kubernetes/ssl/basic-auth.csv \
--enable-bootstrap-token-auth \
--token-auth-file=/opt/kubernetes/ssl/bootstrap-token.csv \
--service-cluster-ip-range=10.1.0.0/16 \
--service-node-port-range=20000-40000 \
--tls-cert-file=/opt/kubernetes/ssl/kubernetes.pem \
--tls-private-key-file=/opt/kubernetes/ssl/kubernetes-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/opt/kubernetes/ssl/ca.pem \
--etcd-certfile=/opt/kubernetes/ssl/kubernetes.pem \
--etcd-keyfile=/opt/kubernetes/ssl/kubernetes-key.pem \
--etcd-servers=https://118.190.201.11:2379,https://118.190.201.12:2379,https://118.190.201.13:2379 \
--enable-swagger-ui=true \
--allow-privileged=true \
--audit-log-maxage=30 \
--audit-log-maxbackup=3 \
--audit-log-maxsize=100 \
--audit-log-path=/opt/kubernetes/log/api-audit.log \
--event-ttl=1h \
--v=2 \
--logtostderr=false \
--log-dir=/opt/kubernetes/log
Restart=on-failure
RestartSec=5
Type=notify
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
6.启动API Server服务
[root@linux-node1 ~]# systemctl daemon-reload
[root@linux-node1 ~]# systemctl enable kube-apiserver
[root@linux-node1 ~]# systemctl start kube-apiserver
查看API Server服务状态
[root@linux-node1 ~]# systemctl status kube-apiserver
[root@linux-node1 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 118.190.201.11:6443 0.0.0.0:* LISTEN 18559/kube-apiserve
tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 17867/etcd
tcp 0 0 118.190.201.11:2379 0.0.0.0:* LISTEN 17867/etcd
tcp 0 0 118.190.201.11:2380 0.0.0.0:* LISTEN 17867/etcd
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 18559/kube-apiserve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1098/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1976/master
tcp6 0 0 :::22 :::* LISTEN 1098/sshd
tcp6 0 0 ::1:25 :::* LISTEN 1976/master
3.2部署Controller Manager服务
[root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/opt/kubernetes/bin/kube-controller-manager \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \
--allocate-node-cidrs=true \
--service-cluster-ip-range=10.1.0.0/16 \
--cluster-cidr=10.2.0.0/16 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \
--root-ca-file=/opt/kubernetes/ssl/ca.pem \
--leader-elect=true \
--v=2 \
--logtostderr=false \
--log-dir=/opt/kubernetes/log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
1.启动Controller Manager
[root@linux-node1 ~]# systemctl daemon-reload
[root@linux-node1 ~]# systemctl enable kube-controller-manager
[root@linux-node1 ~]# systemctl start kube-controller-manager
2.查看服务状态,端口10252
[root@linux-node1 ~]# systemctl status kube-controller-manager
3.3部署Kubernetes Scheduler
[root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
[Service]
ExecStart=/opt/kubernetes/bin/kube-scheduler \
--address=127.0.0.1 \
--master=http://127.0.0.1:8080 \
--leader-elect=true \
--v=2 \
--logtostderr=false \
--log-dir=/opt/kubernetes/log
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
2.启动服务端口10251
[root@linux-node1 ~]# systemctl daemon-reload [root@linux-node1 ~]# systemctl enable kube-scheduler [root@linux-node1 ~]# systemctl start kube-scheduler [root@linux-node1 ~]# systemctl status kube-scheduler
3.4部署kubectl 命令行工具
1.准备二进制命令包
[root@linux-node1 ~]# cd /usr/local/src/kubernetes/client/bin
[root@linux-node1 bin]# cp kubectl /opt/kubernetes/bin/
2.创建 admin 证书签名请求
[root@linux-node1 ~]# cd /usr/local/src/ssl/
[root@linux-node1 ssl]# vim admin-csr.json
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
3.生成 admin 证书和私钥:
[root@linux-node1 ssl]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
[root@linux-node1 ssl]# ls -l admin*
-rw-r--r-- 1 root root 1009 Mar 5 12:29 admin.csr
-rw-r--r-- 1 root root 229 Mar 5 12:28 admin-csr.json
-rw------- 1 root root 1675 Mar 5 12:29 admin-key.pem
-rw-r--r-- 1 root root 1399 Mar 5 12:29 admin.pem
[root@linux-node1 /usr/local/src/ssl]# cp admin*.pem /opt/kubernetes/ssl/
4.设置集群参数
设置证书是因为API Server是通过RBAC进行授权,RBAC预定义了一些角色,所有要设置参数
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://118.190.201.11:6443
Cluster "kubernetes" set.
5.设置客户端认证参数
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-credentials admin \
--client-certificate=/opt/kubernetes/ssl/admin.pem \
--embed-certs=true \
--client-key=/opt/kubernetes/ssl/admin-key.pem
User "admin" set.
6.设置上下文参数
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=admin
Context "kubernetes" created.
7.设置默认上下文
[root@linux-node1 /usr/local/src/ssl]# kubectl config use-context kubernetes
Switched to context "kubernetes".
8.使用kubectl工具
[root@linux-node1 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-1 Healthy {"health":"true"}
etcd-2 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
设置的参数在家目录下生产了 .kube/config
配置文件(kubectl与api通信就使用到这个文件),若想在其它节点上也运行kubectl
需要把这个文件拷贝到其它节点上
4. Kubernetes Node节点部署
4.1-kubelet部署
1.二进制包准备 将软件包从linux-node1复制到其它节点中去。
[root@linux-node1 ~]# cd /usr/local/src/kubernetes/server/bin/ [root@linux-node1 /usr/local/src/kubernetes/server/bin]# cp kubelet kube-proxy /opt/kubernetes/bin/ [root@linux-node1 /usr/local/src/kubernetes/server/bin]# scp kubelet kube-proxy 118.190.201.12:/opt/kubernetes/bin/ [root@linux-node1 /usr/local/src/kubernetes/server/bin]# scp kubelet kube-proxy 118.190.201.13:/opt/kubernetes/bin/
2.创建角色绑定
当kubelet启动的时候会向API Server发送csr-bootstrap的请求,将bootstrap的token设置成对应的角色,这样kubectl才有权限创建请求
[root@linux-node1 /usr/local/src/kubernetes/server/bin]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
3.给kubelet准备一个kubeconfig的配置
创建 kubelet bootstrapping kubeconfig 文件 设置集群参数
生成kubeconfig的配置
[root@linux-node1 /usr/local/src/kubernetes/server/bin]# cd /usr/local/src/ssl/
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://118.190.201.11:6443 \
--kubeconfig=bootstrap.kubeconfig
Cluster "kubernetes" set.
设置客户端认证参数
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-credentials kubelet-bootstrap \
--token=ad6d5bb607a186796d8861557df0d17f \
--kubeconfig=bootstrap.kubeconfig
User "kubelet-bootstrap" set.
设置上下文参数
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
Context "default" created.
选择默认上下文
[root@linux-node1 /usr/local/src/ssl]# kubectl config use-context default --kubeconfig=bootstrap.kubeconfig Switched to context "default". [root@linux-node1 /usr/local/src/ssl]# cp bootstrap.kubeconfig /opt/kubernetes/cfg [root@linux-node1 /usr/local/src/ssl]# scp bootstrap.kubeconfig 118.190.201.12:/opt/kubernetes/cfg [root@linux-node1 /usr/local/src/ssl]# scp bootstrap.kubeconfig 118.190.201.13:/opt/kubernetes/cfg
4.设置CNI支持,cni是k8s网络接口的插件
~]# mkdir -p /etc/cni/net.d ###所有节点执行
[root@linux-node1 ~]# vim /etc/cni/net.d/10-default.conf
{
"name": "flannel",
"type": "flannel",
"delegate": {
"bridge": "docker0",
"isDefaultGateway": true,
"mtu": 1400
}
}
[root@linux-node1 ~]# scp /etc/cni/net.d/10-default.conf 118.190.201.12:/etc/cni/net.d/10-default.conf
[root@linux-node1 ~]# scp /etc/cni/net.d/10-default.conf 118.190.201.13:/etc/cni/net.d/10-default.conf
5.创建kubelet目录
~]# mkdir /var/lib/kubelet ###node节点进行创建
6.创建kubelet服务配置
[root@linux-node1 ~]# vim /usr/lib/systemd/system/kubelet.service ###创建配置文件不启动 [Unit] Description=Kubernetes Kubelet Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet ExecStart=/opt/kubernetes/bin/kubelet \ --address=118.190.201.11 \ --hostname-override=118.190.201.11 \ --pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0 \ --experimental-bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \ --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \ --cert-dir=/opt/kubernetes/ssl \ --network-plugin=cni \ --cni-conf-dir=/etc/cni/net.d \ --cni-bin-dir=/opt/kubernetes/bin/cni \ --cluster-dns=10.1.0.2 \ --cluster-domain=cluster.local. \ --hairpin-mode hairpin-veth \ --allow-privileged=true \ --fail-swap-on=false \ --logtostderr=true \ --v=2 \ --logtostderr=false \ --log-dir=/opt/kubernetes/log Restart=on-failure RestartSec=5 ###进行拷贝到node节点,修改监听地址 [root@linux-node1 ~]# scp /usr/lib/systemd/system/kubelet.service 118.190.201.12:/usr/lib/systemd/system/kubelet.service [root@linux-node1 ~]# scp /usr/lib/systemd/system/kubelet.service 118.190.201.13:/usr/lib/systemd/system/kubelet.service ###node节点修改监听地址 [root@linux-node2 ~]# sed -i 's#118.190.201.11#118.190.201.12#g' /usr/lib/systemd/system/kubelet.service [root@linux-node3 ~]# sed -i 's#118.190.201.11#118.190.201.13#g' /usr/lib/systemd/system/kubelet.service
7.node节点启动Kubelet
~]# systemctl daemon-reload
~]# systemctl enable kubelet
~]# systemctl start kubelet
~]# systemctl status kubelet
8.查看csr请求 注意是在linux-node1上执行
[root@linux-node1 ~]# kubectl get csr ###kubelet起来需要与API做相关证书的通信
NAME AGE REQUESTOR CONDITION
node-csr-HVCroDqY44NHqb5sb8P8qinL-Zbn4EdTmHSKKMxdzWg 2m kubelet-bootstrap Pending
node-csr-m1uxZc8r-SF8wJDBb3X2tbekjO5UrOVJqSBt_N47u9g 2m kubelet-bootstrap Pending
9.批准kubelet 的 TLS 证书请求
[root@linux-node1 ~]# kubectl get csr|grep 'Pending' | awk 'NR>0{print $1}'| xargs kubectl certificate approve
10.执行完毕后,查看节点状态已经是Ready的状态了
[root@linux-node1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION 118.190.201.12 Ready <none> 2m v1.10.1 118.190.201.13 Ready <none> 2m v1.10.1
4.2部署Kubernetes Proxy
1.配置kube-proxy使用LVS
~]# yum install -y ipvsadm ipset conntrack ###node节点安装,本次实验所有节点安装
2.创建 kube-proxy 证书请求
[root@linux-node1 ~]# cd /usr/local/src/ssl/
[root@linux-node1 /usr/local/src/ssl]# vim kube-proxy-csr.json
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
3.生成证书
[root@linux-node1 /usr/local/src/ssl]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
4.分发证书到所有Node节点
[root@linux-node1 /usr/local/src/ssl]# cp kube-proxy*.pem /opt/kubernetes/ssl/ [root@linux-node1 /usr/local/src/ssl]# scp kube-proxy*.pem 118.190.201.12:/opt/kubernetes/ssl/ [root@linux-node1 /usr/local/src/ssl]# scp kube-proxy*.pem 118.190.201.13:/opt/kubernetes/ssl/
5.创建kube-proxy配置文件
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://118.190.201.11:6443 \
--kubeconfig=kube-proxy.kubeconfig
Cluster "kubernetes" set.
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-credentials kube-proxy \
--client-certificate=/opt/kubernetes/ssl/kube-proxy.pem \
--client-key=/opt/kubernetes/ssl/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
User "kube-proxy" set.
[root@linux-node1 /usr/local/src/ssl]# kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
Context "default" created.
[root@linux-node1 /usr/local/src/ssl]# kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
Switched to context "default".
6.分发kubeconfig配置文件
[root@linux-node1 /usr/local/src/ssl]# cp kube-proxy.kubeconfig /opt/kubernetes/cfg/ [root@linux-node1 /usr/local/src/ssl]# scp kube-proxy.kubeconfig 118.190.201.12:/opt/kubernetes/cfg/ [root@linux-node1 /usr/local/src/ssl]# scp kube-proxy.kubeconfig 118.190.201.13:/opt/kubernetes/cfg/
7.创建kube-proxy服务配置
~]# mkdir /var/lib/kube-proxy ###未来所有文件发在这个目录,所有节点创建 [root@linux-node1 ~]# vim /usr/lib/systemd/system/kube-proxy.service ###创建系统服务,node1节点不启动服务 [Unit] Description=Kubernetes Kube-Proxy Server Documentation=https://github.com/GoogleCloudPlatform/kubernetes After=network.target [Service] WorkingDirectory=/var/lib/kube-proxy ExecStart=/opt/kubernetes/bin/kube-proxy \ --bind-address=118.190.201.11 \ --hostname-override=118.190.201.11 \ --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig \ --masquerade-all \ --feature-gates=SupportIPVSProxyMode=true \ --proxy-mode=ipvs \ --ipvs-min-sync-period=5s \ --ipvs-sync-period=5s \ --ipvs-scheduler=rr \ --logtostderr=true \ --v=2 \ --logtostderr=false \ --log-dir=/opt/kubernetes/log Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target ###拷贝到其它节点,修改监听地址 [root@linux-node1 ~]# scp /usr/lib/systemd/system/kube-proxy.service 118.190.201.12:/usr/lib/systemd/system/kube-proxy.service [root@linux-node1 ~]# scp /usr/lib/systemd/system/kube-proxy.service 118.190.201.13:/usr/lib/systemd/system/kube-proxy.service ###修改监听地址 [root@linux-node2 ~]# sed -i 's#118.190.201.11#118.190.201.12#g' /usr/lib/systemd/system/kube-proxy.service [root@linux-node3 ~]# sed -i 's#118.190.201.11#118.190.201.13#g' /usr/lib/systemd/system/kube-proxy.service
8.启动Kubernetes Proxy
###node1节点不用启动
~]# systemctl daemon-reload
~]# systemctl enable kube-proxy
~]# systemctl start kube-proxy
~]# systemctl status kube-proxy
9.查看kube-proxy服务状态
###检查LVS状态
[root@linux-node3 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr persistent 10800
-> 118.190.201.11:6443 Masq 1 0 0
###说明到10.1.0.1:443的地址全部转为118.190.201.11:6443地址API Server
10.使用下面的命令可以检查状态
[root@linux-node1 ~]# kubectl get node NAME STATUS ROLES AGE VERSION 118.190.201.12 Ready <none> 4h v1.10.1 118.190.201.13 Ready <none> 4h v1.10.1
5.Flannel网络部署
5.1-Flannel网络部署
Replication Controller简称RC
- RC是k8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本
- 指定的数目可以是多个也可以是1个,少于指定数目,RC就会启动运行新的副本,多于指定数目,RC就会杀死多余的Pod副本
- 即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行
Replica Set简称RS(官方觉得RC功能弱 新做的RS)
- RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多中的匹配模式。副本集对象一般不单独使用,而是作为部署的理想状态参数使用
- 是k8s1.2中出现的概念,是RC的升级。一般和Deployment共同使用
Deployment
- Deployment表示用户对k8s集群的一次更新操作。Deployment是一个比RS应用模式更广的API对象
- 可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数量增加到理想状态,将旧RS中的副本数减小到0的复合操作
- 这样一个复合操作作用一个RS是不太好描述的,所有用一个更通用的Deployment来描述
Service
- RC、RS和Deployment只是保证了支撑服务的Pod的数量,但是没有解决如何访问这些服务的问题。一个Pod只是一个运行服务额实例,随时可能在一个节点上停止,在另一个节点上以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口提供服务
- 要稳定地提供服务需要服务发现和负载均衡的能力,服务发现完成的工作,是针对客户端访问的服务,找到对应的后端服务实例
- 在k8s集群中,客户端需要访问的服务就是Service对象,每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务
K8s的IP地址
- Node IP:节点设备的IP,如物理机,虚拟机等容器宿主的实际IP
- Pod IP:Pod的IP地址,是根据docker0网络IP段进行分配的
- Cluster IP:Service的IP是一个虚拟IP,仅作用于service对象,有k8s管理和分配,需要结合service port才能使用,单独的IP没有通信功能,集群访问需要一些修改
- 在k8s集群内部,nodeip podip clusterip的通信机制是有k8s制定的路由规则,不是IP路由
1.为Flannel生成证书
[root@linux-node1 ~]# cd /usr/local/src/ssl/
[root@linux-node1 /usr/local/src/ssl]# vim flanneld-csr.json
{
"CN": "flanneld",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
2.生成证书
[root@linux-node1 /usr/local/src/ssl]# cfssl gencert -ca=/opt/kubernetes/ssl/ca.pem \
-ca-key=/opt/kubernetes/ssl/ca-key.pem \
-config=/opt/kubernetes/ssl/ca-config.json \
-profile=kubernetes flanneld-csr.json | cfssljson -bare flanneld
3.分发证书
[root@linux-node1 /usr/local/src/ssl]# cp flanneld*.pem /opt/kubernetes/ssl/ [root@linux-node1 /usr/local/src/ssl]# scp flanneld*.pem 118.190.201.12:/opt/kubernetes/ssl/ [root@linux-node1 /usr/local/src/ssl]# scp flanneld*.pem 118.190.201.13:/opt/kubernetes/ssl/
4.下载Flannel软件包
[root@linux-node1 ~]# cd /usr/local/src
# wget
https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz
[root@linux-node1 src]# tar zxf flannel-v0.10.0-linux-amd64.tar.gz
[root@linux-node1 src]# cp flanneld mk-docker-opts.sh /opt/kubernetes/bin/
##复制到node2 node3节点
[root@linux-node1 src]# scp flanneld mk-docker-opts.sh 118.190.201.12:/opt/kubernetes/bin/
[root@linux-node1 src]# scp flanneld mk-docker-opts.sh 118.190.201.13:/opt/kubernetes/bin/
##复制对应脚本到/opt/kubernetes/bin目录下
[root@linux-node1 ~]# cd /usr/local/src/kubernetes/cluster/centos/node/bin/
[root@linux-node1 /usr/local/src/kubernetes/cluster/centos/node/bin]# cp remove-docker0.sh /opt/kubernetes/bin/
[root@linux-node1 /usr/local/src/kubernetes/cluster/centos/node/bin]# scp remove-docker0.sh 118.190.201.12:/opt/kubernetes/bin/
[root@linux-node1 /usr/local/src/kubernetes/cluster/centos/node/bin]# scp remove-docker0.sh 118.190.201.13:/opt/kubernetes/bin/
5.配置Flannel
[root@linux-node1 ~]# vim /opt/kubernetes/cfg/flannel
FLANNEL_ETCD="-etcd-endpoints=https://118.190.201.11:2379,https://118.190.201.12:2379,https://118.190.201.13:2379"
FLANNEL_ETCD_KEY="-etcd-prefix=/kubernetes/network"
FLANNEL_ETCD_CAFILE="--etcd-cafile=/opt/kubernetes/ssl/ca.pem"
FLANNEL_ETCD_CERTFILE="--etcd-certfile=/opt/kubernetes/ssl/flanneld.pem"
FLANNEL_ETCD_KEYFILE="--etcd-keyfile=/opt/kubernetes/ssl/flanneld-key.pem"
##复制配置到其它节点上
[root@linux-node1 ~]# scp /opt/kubernetes/cfg/flannel 118.190.201.12:/opt/kubernetes/cfg/
[root@linux-node1 ~]# scp /opt/kubernetes/cfg/flannel 118.190.201.13:/opt/kubernetes/cfg/
6.设置Flannel系统服务
[root@linux-node1 ~]# vim /usr/lib/systemd/system/flannel.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network.target
Before=docker.service
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/flannel
ExecStartPre=/opt/kubernetes/bin/remove-docker0.sh
ExecStart=/opt/kubernetes/bin/flanneld ${FLANNEL_ETCD} ${FLANNEL_ETCD_KEY} ${FLANNEL_ETCD_CAFILE} ${FLANNEL_ETCD_CERTFILE} ${FLANNEL_ETCD_KEYFILE}
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -d /run/flannel/docker
Type=notify
[Install]
WantedBy=multi-user.target
RequiredBy=docker.service
复制系统服务脚本到其它节点上
# scp /usr/lib/systemd/system/flannel.service 118.190.201.12:/usr/lib/systemd/system/
# scp /usr/lib/systemd/system/flannel.service 118.190.201.13:/usr/lib/systemd/system/
5.2Flannel CNI集成
1.下载CNI插件
https://github.com/containernetworking/plugins/releases
[root@linux-node1 ~]# cd /usr/local/src/
[root@linux-node1 /usr/local/src]# wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
[root@linux-node1 ~]# mkdir /opt/kubernetes/bin/cni ###所有节点创建
[root@linux-node1 src]# tar zxf cni-plugins-amd64-v0.7.1.tgz -C /opt/kubernetes/bin/cni
# scp -r /opt/kubernetes/bin/cni/* 118.190.201.12:/opt/kubernetes/bin/cni/
# scp -r /opt/kubernetes/bin/cni/* 118.190.201.13:/opt/kubernetes/bin/cni/
2.创建Etcd的key(创建Pod的网段) 一台节点创建
/opt/kubernetes/bin/etcdctl --ca-file /opt/kubernetes/ssl/ca.pem --cert-file /opt/kubernetes/ssl/flanneld.pem --key-file /opt/kubernetes/ssl/flanneld-key.pem \
--no-sync -C https://118.190.201.11:2379,https://118.190.201.12:2379,https://118.190.201.13:2379 \
mk /kubernetes/network/config '{ "Network": "10.2.0.0/16", "Backend": { "Type": "vxlan", "VNI": 1 }}' >/dev/null 2>&1
3.启动flannel,所有节点
systemctl daemon-reload
systemctl enable flannel
chmod +x /opt/kubernetes/bin/*
systemctl start flannel
systemctl status flannel
5.3配置Docker使用Flannel
[root@linux-node1 ~]# vim /usr/lib/systemd/system/docker.service
[Unit] #在Unit下面修改After和增加Requires
After=network-online.target firewalld.service flannel.service
Wants=network-online.target
Requires=flannel.service
[Service] #增加EnvironmentFile=-/run/flannel/docker
Type=notify
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/bin/dockerd $DOCKER_OPTS
1.将配置复制到另外两个阶段
# scp /usr/lib/systemd/system/docker.service 118.190.201.12:/usr/lib/systemd/system/
# scp /usr/lib/systemd/system/docker.service 118.190.201.13:/usr/lib/systemd/system/
2.重启Docker所有节点
systemctl daemon-reload
systemctl restart docker
systemctl status docker
5.4 -创建第一个K8S应用
1.创建一个测试用的deployment
[root@linux-node1 ~]# kubectl run net-test --image=alpine --replicas=2 sleep 360000
2.查看获取IP情况
[root@linux-node1 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE net-test-5767cb94df-75g7v 1/1 Running 0 39s 10.2.44.2 118.190.201.12 net-test-5767cb94df-m26r2 1/1 Running 0 39s 10.2.18.2 118.190.201.13
3.测试联通性
[root@linux-node1 ~]# ping 10.2.44.2
4.部署Nginx应用
[root@linux-node1 ~]# vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10.3
ports:
- containerPort: 80
创建容器
##创建容器
[root@linux-node1 ~]# kubectl create -f nginx-deployment.yaml
###查看
[root@linux-node1 ~]# kubectl get deployment
###查看deployment详情
[root@linux-node1 ~]# kubectl describe deployment nginx-deployment
###查看pod详情
[root@linux-node1 ~]# kubectl describe pod nginx-deployment-75d56bb955-7tbtx
[root@linux-node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
net-test-5767cb94df-75g7v 1/1 Running 0 2h 10.2.44.2 118.190.201.12
net-test-5767cb94df-m26r2 1/1 Running 0 2h 10.2.18.2 118.190.201.13
nginx-deployment-75d56bb955-524zh 1/1 Running 0 9m 10.2.44.3 118.190.201.12
nginx-deployment-75d56bb955-7tbtx 1/1 Running 0 9m 10.2.18.3 118.190.201.13
nginx-deployment-75d56bb955-gw28j 1/1 Running 0 9m 10.2.18.4 118.190.201.13
###测试pod访问
[root@linux-node1 ~]# curl -I http://10.2.44.3
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Fri, 01 Feb 2019 12:43:11 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 31 Jan 2017 15:01:11 GMT
Connection: keep-alive
ETag: "5890a6b7-264"
Accept-Ranges: bytes
###更新deployment
[root@linux-node1 ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.12.2 --record ###--record记录日志
###查看更新后的Deployment
[root@linux-node1 ~]# kubectl get deployment -o wide
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
net-test 2 2 2 2 2h net-test alpine run=net-test
nginx-deployment 3 4 1 3 18m nginx nginx:1.12.2 app=nginx
###查看更新历史
kubectl rollout history deployment/nginx-deployment
###查看具体某一个版本的升级历史
kubectl rollout history deployment/nginx-deployment --revision=1
###快速回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
1.创建Service(因为每次更新IP都会变动)
[root@linux-node1 ~]# vim nginx-services.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
###创建
[root@linux-node1 ~]# kubectl create -f nginx-services.yaml
###创建的service
[root@linux-node1 ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 14h
nginx-service ClusterIP 10.1.157.91 <none> 80/TCP 51s
###pod访问测试
~]# curl -I http://10.1.157.91 ###因为node1没有安装kube-proxy,所以需要在node2 node3节点上执行
[root@linux-node2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.1.0.1:443 rr persistent 10800
-> 118.190.201.11:6443 Masq 1 0 0
TCP 10.1.157.91:80 rr ###访问10.1.157.91:80之后转发到下面节点上
-> 10.2.18.6:80 Masq 1 0 0
-> 10.2.18.7:80 Masq 1 0 0
-> 10.2.44.6:80 Masq 1 0 0
###快速扩容
[root@linux-node1 ~]# kubectl scale deployment nginx-deployment --replicas 5
[root@linux-node1 ~]# kubectl get pod -o wide
补充国内镜像: # –pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 \
如无特殊说明,文章均为本站原创,转载请注明出处
- 转载请注明来源:Kubernetes构建企业容器云入门篇
- 本文永久链接地址:https://www.xionghaier.cn/archives/959.html