一、基于Dockerfile構(gòu)建nginx鏡像
1.1 準(zhǔn)備Dockerfile用到的文件
- 修改鏡像源為清華大學(xué)鏡像源,創(chuàng)建sources.list文件
網(wǎng)址:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ - 下載nginx安裝包
網(wǎng)址:https://nginx.org/en/download.html - 啟動(dòng)nginx容器,從容器中拷貝nginx.conf文件到宿主機(jī)
- 編寫docker-entrypoint.sh腳本拒贱,并添加可執(zhí)行權(quán)限
1.2 編寫Dockerfile文件
cat >> Dockerfile <<EOF
# 基于底層鏡像
FROM ubuntu:20.04
# label標(biāo)簽是key/value形式 描述鏡像信息
LABEL "maintiner"="Chris"
# 修改鏡像源信息
COPY sources.list /etc/apt/sources.list
# 更新鏡像源 安裝編譯依賴 創(chuàng)建目錄
RUN apt update && apt install -y iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev gcc openssh-server iotop unzip zip make vim && mkdir -p /data/nginx
# 拷貝壓縮包并自動(dòng)解壓
ADD nginx-1.20.2.tar.gz /usr/local/src
# 編譯并刪除解壓目錄
RUN cd /usr/local/src/nginx-1.20.2 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /app/nginx/sbin/nginx /usr/bin && rm -rf /usr/local/src/nginx-1.20.2
# 拷貝nginx.conf配置文件
ADD nginx.conf /apps/nginx/conf/nginx.conf
# 拷貝docker-entrypoint.sh
ADD docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
# 鏈接標(biāo)準(zhǔn)輸出和錯(cuò)誤日志 可docker logs查看
RUN ln -sv /dev/stdout /apps/nginx/logs/access.log
RUN ln -sv /dev/stderr /apps/nginx/logs/error.log
# 添加nginx用戶和組 修改目錄歸屬用戶和組
RUN groupadd -g 2022 nginx && useradd -g nginx -s /usr/sbin/nologin -u 2022 nginx && chown -R nginx.nginx /apps/nginx /data/nginx
# 容器占用端口
EXPOSE 80 443
# 啟動(dòng)命令
#CMD ["/apps/nginx/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["-g","daemon off;"]
EOF
1.3 構(gòu)建鏡像
docker build -t 192.168.204.200/n60/nginx:v1.20.2 .
1.4 運(yùn)行容器
docker run -itd -p80:80 192.168.204.200/n60/nginx:v1.20.2
1.5 訪問容器
nginx.jpg
二、Docker的cpu和內(nèi)存的資源限制
2.1 下載壓測鏡像
docker pull lorel/docker-stress-ng:latest
2.2 壓測cpu
- 容器需要使用cpu個(gè)數(shù)為2
docker run -it --rm lorel/docker-stress-ng --cpu 2
top 按1查看
-
two cpus.jpg
docker stats查看 - two cpus docker stats.jpg
限制容器使用cpu個(gè)數(shù)為1,容器需要使用的cpu個(gè)數(shù)為2
docker run -it --cpus 1 --rm lorel/docker-stress-ng --cpu 2
top 按1查看
-
limit 1 top.jpg
docker stats - limit 1 stats.jpg
- 在宿主機(jī)上查看分配給容器的cpu
cat /sys/fs/cgroup/cpu,cpuacct/docker/fd984ff398613870ba22adb329415fd4ea214d97e1f24d52b2cf6862085e16b2/cpu.cfs_quota_us
文件中的單位是毫核焊切,除以1000是百分比的形式,再除以100是cpu個(gè)數(shù)
- check cpu.jpg
2.3 壓測內(nèi)存
- 默認(rèn)兩個(gè)vm芳室,占用兩個(gè)cpu专肪,使用命令限制容器使用一個(gè)cpu
docker run -it --cpus 1 --rm lorel/docker-stress-ng --vm 2
- 容器需要使用兩個(gè)vm,一個(gè)vm使用256M
docker stats - two vm mem stats.jpg
- 限制容器使用內(nèi)存200M
docker run -it --cpus 1 -m 200m --rm lorel/docker-stress-ng --vm 2
docker stats
- limit 200 mem.jpg
- 在宿主機(jī)上查看分配給容器的mem
cat /sys/fs/cgroup/memory/docker/e2dd9d29676f664507e233366b6de911f50bacd626033bf362543a57c6cd866c/memory.limit_in_bytes
文件中單位是字節(jié)堪侯,除以1024是K嚎尤,再除以1024是M
- check mem.jpg
三、Docker存儲(chǔ)卷和網(wǎng)絡(luò)
3.1 查看容器詳細(xì)信息
docker inspect 容器id
- Lower Dir:image鏡像層(鏡像本身伍宦,只讀)
- Upper Dir:容器的上層(讀寫)
- Merged Dir:容器的文件系統(tǒng)芽死,使用Union FS(聯(lián)合文件系統(tǒng))將lower dir和upper dir合并給容器使用
- Work Dir:容器在宿主機(jī)的工作目錄
3.2 容器在宿主機(jī)的目錄
- docker數(shù)據(jù)默認(rèn)在宿主機(jī)/var/lib/docker目錄下乏梁,在容器中寫入的文件,一旦容器被刪除关贵,目錄丟失
3.3 容器掛載目錄
- 創(chuàng)建目錄
mkdir -p /data/testapp
echo "testapp page" > /data/testapp/index.html
- 啟動(dòng)兩個(gè)tomcat容器
docker run -tid --name web1 -v /data/testapp:/usr/local/tomcat/webapps/testapp -p 8080:8080 tomcat:8.5.73
docker run -tid --name web2 -v /data/testapp:/usr/local/tomcat/webapps/testapp -p 8081:8080 tomcat:8.5.73
- 兩個(gè)容器訪問的數(shù)據(jù)目錄一樣
web1
web1.jpg
web2
web2.jpg - 掛載只讀目錄
docker run -itd --name web3 -v /data/tomcat/conf/server.xml:/usr/local/tomcat/conf/server.xml:ro -v /data/testapp:/usr/local/tomcat/webapps/testapp -p 8083:8080 tomcat:8.5.73
server.xml只讀
ro.jpg
- 創(chuàng)建docker volume
docker volume create n60
創(chuàng)建卷n60
volume n60.jpg
- 掛載docker volume
docker run -it -p 3306:3306 -v n60:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.38
- volume n60 mysqldata.jpg
3.4 Docker網(wǎng)絡(luò)介紹
- 查看docker網(wǎng)絡(luò)
docker network ls
docker network ls.jpg
四遇骑、k8s各組件的功能介紹
4.1 kube-apiserver
- 運(yùn)行在master節(jié)點(diǎn)上
- Kubernetes API server提供k8s各類資源對象的增刪改查及watch等HTTP Rest接口,這些對象包括pods揖曾、services落萎、replicationcontrollers等,API Server為REST等操作提供服務(wù)炭剪,并為集群的共享狀態(tài)提供前端练链,所有其他組件都通過改前端進(jìn)行交互。
- 端口默認(rèn)值為6443奴拦,可通過啟動(dòng)參數(shù)"--secure-port"的值來修改默認(rèn)值兑宇。
- 默認(rèn)IP地址為非本地(Non-Localhost)網(wǎng)絡(luò)端口,通過啟動(dòng)參數(shù)"--bind-address"設(shè)置改值粱坤。
- 端口用于接收客戶端隶糕、dashboard等外部HTTPS請求。
- 用于基于Tocken文件或客戶端證書以及HTTP Base的請求站玄。
- 用于基于策略的授權(quán)枚驻。
4.2 kube-scheduler
- 運(yùn)行在master節(jié)點(diǎn)上
- Kubernetes調(diào)度器是一個(gè)控制面進(jìn)程,負(fù)責(zé)Pods指派到節(jié)點(diǎn)上株旷。
- 通過調(diào)度算法為待調(diào)度Pod列表的每個(gè)Pod從可用Node列表中選擇一個(gè)最合適的Node再登,并將信息寫入etcd中。
- node節(jié)點(diǎn)上的kubelet通過API Server監(jiān)聽到kubernetes scheduler產(chǎn)生的Pod綁定信息晾剖,然后獲取對應(yīng)的Pod清單锉矢,下載Image,并啟動(dòng)容器齿尽。
- 策略:
????LeastRequestedPriority:優(yōu)先從備選節(jié)點(diǎn)列表中選擇資源消耗最小的節(jié)點(diǎn)(CPU+內(nèi)存)沽损。
????CalculateNodeLabelPriority:優(yōu)先選擇含有指定Label的節(jié)點(diǎn)。
????BalancedResourceAllocation:優(yōu)先從備選節(jié)點(diǎn)列表中選擇各項(xiàng)資源使用率最均衡的節(jié)點(diǎn)循头。
4.3 kube-controller-manager
- 運(yùn)行在master節(jié)點(diǎn)上
- Controller Manager還包括一些子控制器(副本控制器绵估、節(jié)點(diǎn)控制器、命名空間控制器和服務(wù)賬號(hào)控制器等)卡骂,控制器作為集群內(nèi)部的管理控制中心国裳,負(fù)責(zé)集群內(nèi)的Node、Pod副本全跨、服務(wù)端點(diǎn)(Endpoint)缝左、命名空間(Namespace)、服務(wù)賬號(hào)(ServiceAccount)、資源定額(ResourceQuota)的管理渺杉,當(dāng)某個(gè)Node意外宕機(jī)時(shí)蛇数,Controller Manager會(huì)及時(shí)發(fā)現(xiàn)并執(zhí)行自動(dòng)化修復(fù)流程,確保集群中的pod副本始終處于預(yù)期的工作狀態(tài)少办。
- 每間隔5秒檢查一次節(jié)點(diǎn)的狀態(tài)。
- 如果沒有收到節(jié)點(diǎn)的心跳诵原,則將該node節(jié)點(diǎn)標(biāo)記為不可達(dá)英妓。
- 在標(biāo)記為無法訪問之前等待40秒。
- 如果該node節(jié)點(diǎn)被標(biāo)記為無法訪問后5分鐘還沒有恢復(fù)绍赛,Controller manager會(huì)刪除當(dāng)前node節(jié)點(diǎn)的所有pod并在其它可用節(jié)點(diǎn)重建這些pod蔓纠。
- pod高可用機(jī)制:
????node monitor period:節(jié)點(diǎn)監(jiān)視周期,5s
????node monitor grace period:節(jié)點(diǎn)監(jiān)視器寬限期吗蚌,40s
????pod eviction timeout:pod驅(qū)逐超時(shí)時(shí)間腿倚,5m
4.4 kube-proxy
- 運(yùn)行在node節(jié)點(diǎn)上
- 反映了node上Kubernetes API中定義的服務(wù),并可以通過一組后端進(jìn)行簡單的TCP蚯妇、UDP和SCTP流轉(zhuǎn)發(fā)或者在一組后端進(jìn)行循環(huán)TCP敷燎、UDP和SCTP轉(zhuǎn)發(fā),用戶必須使用apiserver API創(chuàng)建一個(gè)服務(wù)來配置代理箩言,其實(shí)就是kube-proxy通過在主機(jī)上維護(hù)網(wǎng)絡(luò)規(guī)則并執(zhí)行連接轉(zhuǎn)發(fā)來實(shí)現(xiàn)Kubernetes服務(wù)訪問硬贯。
- 監(jiān)聽API Server中服務(wù)對象的變化,再通過管理IPtables或者IPVS規(guī)則陨收,實(shí)現(xiàn)網(wǎng)絡(luò)的轉(zhuǎn)發(fā)饭豹。
- 不同版本可支持三種工作模式:
????UserSpace:k8s v1.1之前使用,k8s 1.2及以后就已經(jīng)淘汰务漩。
????IPtables:k8s 1.1版本開始支持拄衰,1.2開始為默認(rèn)模式
????IPVS:k8s 1.9引入到1.11為正式版本,需要安裝ipvsadm饵骨、ipset工具包和加載ip_vs內(nèi)核模塊 - 當(dāng)kube-proxy以IPVS代理模式啟動(dòng)時(shí)翘悉,kube-proxy將驗(yàn)證節(jié)點(diǎn)上是否安裝了IPVS模塊,如果未安裝居触,則kube-proxy將回退到IPtables代理模式镐确。
- 使用IPVS模式,kube-proxy會(huì)監(jiān)視Kubernetes Service對象和Endpoints饼煞,調(diào)用宿主機(jī)內(nèi)核Netlink接口以相應(yīng)的創(chuàng)建IPVS規(guī)則并定期與Kubernetes Service對象Endpoints對象同步IPVS規(guī)則源葫,以確保IPVS狀態(tài)與期望一直,訪問服務(wù)時(shí)砖瞧,流量將被重定向到其中一個(gè)后端Pod息堂,IPVS使用哈希表作為底層數(shù)據(jù)結(jié)構(gòu)并在內(nèi)核空間中工作,這意味著IPVS可以更快地重定向流量,并且在同步代理規(guī)則時(shí)具有更好的性能荣堰。
4.5 kubelet
- 運(yùn)行在node節(jié)點(diǎn)上
- worker節(jié)點(diǎn)的代理組件床未,監(jiān)視分配給節(jié)點(diǎn)的pod
- 向master匯報(bào)node節(jié)點(diǎn)的狀態(tài)信息
- 接收指令并在Pod中創(chuàng)建docker容器
- 準(zhǔn)備Pod所需的數(shù)據(jù)卷
- 返回Pod的運(yùn)行狀態(tài)
- 在node節(jié)點(diǎn)執(zhí)行容器健康檢查
4.6 kubectl
- 是一個(gè)通過命令對kubernetes集群進(jìn)行管理的客戶端工具。
4.7 etcd
- 是由CoreOS公司開發(fā)振坚,目前是kubernetes默認(rèn)使用的key-value數(shù)據(jù)存儲(chǔ)系統(tǒng)薇搁,用于保存kubernetes的所有集群數(shù)據(jù),etcd支持分布式集群功能渡八,生產(chǎn)環(huán)境使用時(shí)需要為etcd數(shù)據(jù)提供定期備份機(jī)制啃洋。
4.8 dns
- DNS負(fù)責(zé)為整個(gè)集群提供DNS服務(wù),從而實(shí)現(xiàn)服務(wù)之間的訪問屎鳍。
4.9 Dashboard
- Dashboard是基于網(wǎng)頁的kubernetes用戶界面宏娄,可以使用Dashboard獲取運(yùn)行在集群中的應(yīng)用的概覽信息,也可以創(chuàng)建或者修改kubernetes資源(如Deployment逮壁、Job孵坚、DaemonSet等),也可以對Deployment實(shí)現(xiàn)彈性伸縮窥淆、發(fā)起滾動(dòng)升級卖宠、重啟Pod或者使用向?qū)?chuàng)建新的應(yīng)用。
五忧饭、部署高可用k8s集群
主機(jī)環(huán)境準(zhǔn)備
IP | 角色 | 系統(tǒng) | 內(nèi)存 | CPU |
---|---|---|---|---|
192.168.96.11 | k8s-master1 | ubutu 20.04.3 | 2G | 2C |
192.168.96.12 | k8s-master2 | ubutu 20.04.3 | 2G | 2C |
192.168.96.13 | k8s-node1 | ubutu 20.04.3 | 2G | 2C |
192.168.96.14 | k8s-node2 | ubutu 20.04.3 | 2G | 2C |
192.168.96.12 | k8s-etcd1 | ubutu 20.04.3 | 2G | 2C |
192.168.96.13 | k8s-etcd2 | ubutu 20.04.3 | 2G | 2C |
192.168.96.14 | k8s-etcd3 | ubutu 20.04.3 | 2G | 2C |
192.168.96.12 | k8s-harbor1 | ubutu 20.04.3 | 2G | 2C |
192.168.96.13 | k8s-harbor2 | ubutu 20.04.3 | 2G | 2C |
192.168.96.12 | k8s-keepalived1 | ubutu 20.04.3 | 2G | 2C |
192.168.96.13 | k8s-keepalived2 | ubutu 20.04.3 | 2G | 2C |
192.168.96.12 | k8s-haproxy1 | ubutu 20.04.3 | 2G | 2C |
192.168.96.13 | k8s-haproxy2 | ubutu 20.04.3 | 2G | 2C |
5.1 部署keepalived和haproxy
- 192.168.96.12主機(jī)配置keepalived
apt install -y keepalived haproxy
cat > /etc/keepalived/keepalive.conf <<EOF
global_defs {
notification_email {
acassen
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER
interface ens33
garp_master_delay 10
smtp_alert
virtual_router_id 60
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.96.188 dev ens33 label ens33:0
192.168.96.189 dev ens33 label ens33:1
192.168.96.190 dev ens33 label ens33:2
192.168.96.191 dev ens33 label ens33:3
}
}
EOF
systemctl restart keepalived.service
ifconfig | grep 192.168. # 查看vip
- 192.168.96.13主機(jī)配置keepalived
apt install -y keepalived haproxy
cat > /etc/keepalived/keepalive.conf <<EOF
global_defs {
notification_email {
acassen
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
garp_master_delay 10
smtp_alert
virtual_router_id 60
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.96.188 dev ens33 label ens33:0
192.168.96.189 dev ens33 label ens33:1
192.168.96.190 dev ens33 label ens33:2
192.168.96.191 dev ens33 label ens33:3
}
}
EOF
systemctl restart keepalived.service
- 192.168.96.12主機(jī)逗堵,驗(yàn)證vip切換,停止keepalived眷昆,再啟動(dòng)
ifconfig | grep 192.168. # 查看vip
systemctl stop keepalived.service # 停止keepalived
ifconfig | grep 192.168. # vip飄到備機(jī)
systemctl start keepalived.service # 再啟動(dòng)keepalived
ifconfig | grep 192.168. # vip回到主機(jī)
- 192.168.96.12主機(jī)配置haproxy
cat > /etc/haproxy/haproxy.cfg <<EOF
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen k8s-6443
bind 192.168.96.188:6443
mode tcp
server 192.168.96.11 192.168.96.11:6443 check inter 2s fall 3 rise 5
server 192.168.96.12 192.168.96.12:6443 check inter 2s fall 3 rise 5
EOF
systemctl restart haproxy
ss -ntl # 查看vip端口是否監(jiān)聽
- 192.168.96.13主機(jī)配置haproxy
cat > /etc/haproxy/haproxy.cfg <<EOF
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
listen k8s-6443
bind 192.168.96.188:6443
mode tcp
server 192.168.96.11 192.168.96.11:6443 check inter 2s fall 3 rise 5
server 192.168.96.12 192.168.96.12:6443 check inter 2s fall 3 rise 5
EOF
echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf # 修改內(nèi)核參數(shù)蜒秤,允許服務(wù)監(jiān)聽在本機(jī)沒有的地址上
sysctl -p # 使參數(shù)生效
systemctl restart haproxy
ss -ntl # 查看vip端口是否監(jiān)聽
5.2 部署harbor
- 192.168.96.12安裝harbor
cp harbor.yml.tmpl harbor.yml # 賦值harbor配置文件,然后修改hostname為harbor域名
mkdir certs # 創(chuàng)建目錄亚斋,用作存放證書
openssl genrsa -out ./harbor-ca.key # 生成私有key
openssl req -x509 -new -nodes -key ./harbor-ca.key -subj "/CN=HARBOR_DOMAIN" -days 3650 -out ./harbor-ca.crt # 給harbor的域名簽發(fā)十年有效期的證書作媚,然后修改harbor中證書和私鑰路徑
./install.sh --with-trivy --with-chartmuseum # 安裝harbor
然后修改電腦hosts文件,用harbor域名從瀏覽器中訪問帅刊,新建項(xiàng)目測試