<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          就煩別人問我到底什么是云原生?

          共 8923字,需瀏覽 18分鐘

           ·

          2021-05-11 03:05


          近年來,隨著云計算概念和技術的普及,云原生一詞也越來越熱門,無論是應用還是安全,凡是和云相關的,都要在云后面加上原生二字,好像不提云原生,在技術上就落后了一大截。


          云原生產(chǎn)生背景


          隨著云計算技術的發(fā)展,企業(yè)上云已成為趨勢,越來越多的企業(yè)都已將應用部署到了云上。但是應用上云并不意味著就能充分利用云平臺的優(yōu)勢。目前,大部分云化的應用,都是基于傳統(tǒng)的軟件架構(gòu)來搭建的,然后再移植到云上去運行,和云平臺的整合度非常低,主要表現(xiàn)在以下幾個方面:

          操作系統(tǒng)依賴強

          傳統(tǒng)應用程序和底層操作系統(tǒng)、硬件、存儲和后備服務之間存在緊密的依賴關系,這些依賴關系使得應用程序在跨越云基礎設施進行遷移和擴展時非常復雜且有風險。

          系統(tǒng)緊耦合

          傳統(tǒng)的企業(yè)應用多采用單體架構(gòu),將許多不同的功能模塊捆綁在一個部署包中,導致功能模塊之間產(chǎn)生不必要的依賴,并導致開發(fā)和部署過程中喪失敏捷性,無法獨立的部署、發(fā)布更新、重啟。

          手動化擴展

          通過手工管理基礎設施,包括手工編寫管理服務器、網(wǎng)絡和存儲的配置腳本。在大規(guī)模復雜的操作中,操作人員在診斷問題時會很慢,而且無法大規(guī)模地實施。手工制作的自動化腳本還有可能將人為錯誤硬編碼到基礎設施中。

          恢復緩慢

          基于虛擬機的基礎設施相對于基于微服務的應用程序來說,是緩慢而低效的。因為單個虛擬機啟動/關閉的速度很慢,并且在部署應用程序代碼之前就會帶來巨大的開銷。

          瀑布開發(fā)

          傳統(tǒng)應用的開發(fā)模式,IT團隊定期發(fā)布軟件,通常間隔幾周或幾個月。盡管發(fā)布的許多組件已經(jīng)提前準備好了,并且沒有依賴關系,也必須等待版本中的其他組件。客戶想要的功能被延遲,企業(yè)失去贏得客戶和增加收入的機會。

          總體來說,提供方便的基礎設施,只是對云計算最初級的利用(提升利用率,按需使用,不夠了隨時擴容),無法充分發(fā)揮云計算的優(yōu)勢,要想充分發(fā)揮云計算的優(yōu)勢(彈性、高可用性、易擴展性),就必須進行真正的云化,不僅僅是基礎設施和平臺的變化,應用也需要做出改變,這就需要擯棄傳統(tǒng)的方法,在架構(gòu)設計、開發(fā)方式、部署維護等各個階段和方面都基于云的特點重新設計,從而建設全新的云化的應用,也就是云原生的應用。


          云原生的定義


          關于什么是云原生,不同的人定義不同,目前比較權威的定義主要來自Pivotal公司和云原生計算基金會(Cloud Native Computing Foundation,簡稱CNCF)。

          Pivotal的定義

          Pivotal公司是云原生應用的提出者,并推出了Cloud Foundry和Spring系列開發(fā)框架,因此,也是云原生的先驅(qū)者和探路者。

          早在2015年,Pivotal公司的Matt Stine寫了一本名為《遷移到云原生應用架構(gòu)》的小冊子,其中探討了云原生應用架構(gòu)的幾個主要特征:符合12因素的應用、面向微服務架構(gòu)、自服務敏捷架構(gòu)、基于API的協(xié)作以及抗脆弱性。

          在2017年10月,接受InfoQ采訪時,Matt Stine對云原生的定義做了小幅調(diào)整,將云原生架構(gòu)定義為具有以下六個特質(zhì):模塊化(Modularity)、可觀測性(Observability)、可部署性(Deployability)、可測試性(Testability)、可處理性(Disposability)以及可替換性(Replaceability)。而Pivotal官網(wǎng)對云原生概括為4個要點:DevOps、持續(xù)交付、微服務以及容器化。

          圖 1:Pivotal云原生思想

          Matt Stine認為云原生是一個思想的集合,云原生既包含技術(微服務,敏捷基礎設施),也包含管理(DevOps、持續(xù)交付、康威定律以及重組等),云原生也可以說是一系列云技術、企業(yè)管理方法的集合。

          CNCF的定義

          CNCF是在2015年由Google聯(lián)合Linux基金會成立的,它是一個非盈利組織,主要宗旨是統(tǒng)一云計算接口和相關標準,通過技術優(yōu)勢和用戶價值創(chuàng)造一套新的通用容器技術,推動云計算和服務的發(fā)展。起初CNCF對云原生(Cloud Native)的定義包含以下三個方面:

          • 應用容器化

          • 面向微服務架構(gòu)

          • 應用支持容器的編排調(diào)度


          到了2018年,隨著云原生生態(tài)的不斷壯大,所有主流云計算供應商都加入了該基金會,且從云原生的全景圖中可以看出云原生正在蠶食原先非云原生應用的部分。

          CNCF基金會中的會員以及容納的項目越來越多,該定義已經(jīng)限制了云原生生態(tài)的發(fā)展,CNCF為云原生進行了重新定位,并于2018年6月11日明確了云原生定義1.0版本:云原生技術有利于各組織在公有云、私有云和混合云等新型動態(tài)環(huán)境中,構(gòu)建和運行可彈性擴展的應用。云原生的代表技術包括容器、服務網(wǎng)格、微服務、不可變基礎設施和聲明式API。

          圖 2:云原生代表技術

          這些技術能夠構(gòu)建容錯性好、易于管理和便于觀察的松耦合系統(tǒng)。結(jié)合可靠的自動化手段,云原生技術使工程師能夠輕松地對系統(tǒng)作出頻繁和可預測的重大變更。


          云原生相關技術


          依據(jù)CNCF發(fā)布的云原生1.0版本的定義,云原生技術主要包括容器、微服務、服務網(wǎng)格、不可變基礎設施以及聲明式API,下面就這幾類技術做個概述:

          容器技術

          容器技術和云原生好比一對螺旋體,容器技術催生了云原生思潮,云原生生態(tài)推動了容器技術發(fā)展。從2013年Docker技術誕生,到2015年CNCF這個云原生領域重量級聯(lián)盟成立,這不是歷史的巧合而是歷史的必然。作為云原生關鍵技術之一的容器,從2013年誕生以來一直是行業(yè)關注的焦點之一。

          2013年之前,云計算行業(yè)一直在為云原生的正確打開姿勢而操心。Platform as a Service(PaaS)看起來是個有前途的方向。2006年Fotango公司發(fā)布的Zimi服務,可以說是PaaS行業(yè)的鼻祖,具有按使用付費、免運維(Serverless)、API化配置和服務等典型云原生的特征;2008年Google推出Google App Engine(GAE);2011年Pivotal發(fā)布Cloud Foundry。

          這些早期的PaaS平臺在云原生領域進行了非常有益的探索,推動了云原生生態(tài)的健康發(fā)展,但是這些早期探索技術并沒有形成大的行業(yè)趨勢,而是局限在一些的特定的領域。直到Docker開源,大家才如夢方醒,原來不是方向不對,而是應用分發(fā)和交付的手段不行。

          Docker真正核心的創(chuàng)新是容器鏡像(docker image),一種新型的應用打包、分發(fā)和運行機制。容器鏡像將應用運行環(huán)境,包括代碼、依賴庫、工具、資源文件和元信息等,打包成一種操作系統(tǒng)發(fā)行版無關的不可變更軟件包。

          容器鏡像打包了整個容器運行依賴的環(huán)境,以避免依賴運行容器的服務器的操作系統(tǒng),從而實現(xiàn)“build once, run anywhere”。容器鏡像一旦構(gòu)建完成,就變成read only,成為不可變基礎設施的一份子。

          微服務

          微服務架構(gòu)是相對于單體架構(gòu)來說的,兩者分屬不同的架構(gòu)風格。在微服務架構(gòu)中,服務是一個單一的、可獨立部署的軟件組件,它實現(xiàn)了一些有用的功能,服務的API封裝了其內(nèi)部實現(xiàn),與單體架構(gòu)不同,開發(fā)人員無法繞過服務的API直接訪問服務內(nèi)部的方法和數(shù)據(jù),因此,微服務架構(gòu)強制實現(xiàn)了應用程序的模塊化。

          微服務架構(gòu)的最核心特性是服務之間的松耦合性。服務之間的交互采用API完成,這樣做就封裝了服務的實現(xiàn)細節(jié),從而實現(xiàn)了在不影響客戶端的情況下,對實現(xiàn)方式做出修改。

          微服務架構(gòu)通過將大的系統(tǒng)按照業(yè)務服務的粒度進行拆分,每個服務可獨立開發(fā)、測試、驗證和部署,這樣分解后,帶來的好處有如下幾點:

          • 使大型的復雜應用程序可以持續(xù)交付和持續(xù)部署

          • 每個服務都相對較小并容易維護

          • 服務可以獨立部署

          • 服務可以獨立擴展

          • 微服務架構(gòu)可以實現(xiàn)團隊的自治

          • 更容易實驗和采納新的技術

          • 更好的容錯性


          服務網(wǎng)格

          服務網(wǎng)格是用于處理服務間通信的專用基礎設施層,負責在微服務間進行可靠地請求傳遞。服務網(wǎng)格通常通過一組輕量級網(wǎng)絡代理來實現(xiàn),這些代理與應用程序代碼一起部署,而不需要感知應用程序本身。

          隨著規(guī)模和復雜性的增長,服務網(wǎng)格包含的實現(xiàn)的功能越來越多,它的需求包括服務發(fā)現(xiàn)、負載均衡、故障恢復、指標收集和監(jiān)控以及通常更加復雜的運維需求,例如A/B測試、金絲雀發(fā)布、限流、訪問控制和端到端認證等。其部署結(jié)構(gòu)如下圖所示:

          圖 3:服務網(wǎng)格部署圖

          服務網(wǎng)格有如下幾個特點:

          • 應用程序間通訊的中間層

          • 輕量級網(wǎng)絡代理

          • 應用程序無感知

          • 解耦應用程序的重試/超時、監(jiān)控、追蹤和服務發(fā)現(xiàn)


          如果用一句話來解釋什么是服務網(wǎng)格,可以將它比作是應用程序或者說微服務間的TCP/IP,負責服務之間的網(wǎng)絡訪問、限流、熔斷和監(jiān)控。對于編寫應用程序來說一般無須關心TCP/IP這一層(比如通過HTTP協(xié)議的RESTful應用),同樣使用服務網(wǎng)格也就無須關系服務之間的那些原來是通過應用程序或者其他框架實現(xiàn)的事情,比如Spring Cloud、OSS,現(xiàn)在只要交給服務網(wǎng)格就可以了,從而極大地方便了微服務應用的開發(fā)。

          不可變基礎設施

          一個工作負載(比如容器、虛擬機等)一旦部署以后就不會被修改。當需要更新,修復或修改某些內(nèi)容的時候,只需要將新的、經(jīng)過驗證的工作負載替換舊的即可。

          不可變基礎設施的作用主要體現(xiàn)在系統(tǒng)的穩(wěn)定性方面。傳統(tǒng)的應用程序一旦部署到用戶特定的服務器上以后,服務器系統(tǒng)是會不斷變化的,不是操作系統(tǒng)升級,就是安裝了新的應用,可能引起沖突,導致應用程序需要跟著用戶系統(tǒng)環(huán)境的改變而不斷升級,這中間就會不斷地出現(xiàn)新的問題。而不可變基礎設施就規(guī)避了所有的這些問題,因為云原生應用是部署在不可變的基礎設施上的,因此就不存在變化的問題。

          聲明式API

          聲明式API是一種比命令式API更高級的接口設計方式,簡單來說,命令式API提供給用戶怎么做的能力,而聲明式API給用戶提供了做什么的能力。

          聲明式API是比命令式API更高級的一種接口,舉個例子,假如我們有一個炒菜機,如果炒菜機提供的接口是放油、放調(diào)料、放食材、大火、小火等操作,那就是命令式API。

          如果炒菜機提供的接口是來盤宮保雞丁、來盤魚香肉絲之類的,那就是聲明式API了。聲明式API比較典型的例子就是數(shù)據(jù)庫提供的SQL接口,只需要告訴數(shù)據(jù)庫你需要什么數(shù)據(jù)即可,至于怎么去獲取這些數(shù)據(jù),數(shù)據(jù)庫自己會去按步驟操作。


          云原生的意義


          傳統(tǒng)的軟件開發(fā)模式,在使用云計算平臺時和使用物理機時沒有什么大的區(qū)別,那么就沒有將云平臺的能力利用充分,在一定程度上導致了資源的浪費。云原生就是用來解決這一類的問題,將云計算平臺的優(yōu)勢發(fā)揮到極致。

          讓企業(yè)應用能夠利用云平臺實現(xiàn)資源的按需分配和彈性伸縮,是云原生應用重點關注的地方。它要求云原生應用具備可用性和伸縮性,以及自動化部署和管理能力,可隨處運行,并且能夠通過持續(xù)集成、持續(xù)交付提升研發(fā)、測試與發(fā)布的效率。云原生應用并未完全顛覆傳統(tǒng)的應用,采用云原生的設計模式可以優(yōu)化和改進傳統(tǒng)應用模式,使應用更加適合在云平臺上運行。

          云原生存在的意義是解放開發(fā)和運維,而不是讓開發(fā)和運維的工作變得更加復雜和繁重。云原生還關注規(guī)模,分布式系統(tǒng)應該具備將節(jié)點進行水平擴展的能力,能輕易地擴展到成千上萬的規(guī)模,并且這些節(jié)點具備多租戶和自愈能力。云原生使得應用本身具備“柔性”,即面對強大壓力的緩解能力以及壓力過后的恢復能力。


          云原生當前生態(tài)


          作為云原生領域最具權威的組織,CNCF在每年的年度報告中都會提及CNCF Landscape項目,該項目開始于2016年11月,旨在為云原生應用者提供一個資源地圖,幫助企業(yè)和開發(fā)人員快速了解云原生體系的全貌。CNCF Landscape項目在Github上已經(jīng)獲得超過7000顆星,表明廣大開發(fā)者和使用者對該項目的關注和重視。該項目給出當前云原生生態(tài)的全景圖(如下圖所示),通過該全景圖我們可以了解云原生相關的各種類型的項目和產(chǎn)品:

          圖 4:CNCF生態(tài)全景圖

          這張全景圖從云原生的層次結(jié)構(gòu),以及不同的功能組成上,展現(xiàn)了云原生體系的全貌,可以幫助用戶在不同組件層次去選擇恰當?shù)能浖凸ぞ哌M行支持。總體來看,云原生生態(tài)分為以下幾層:

          Kubernetes服務提供商

          圖中最底層是Kubernetes認證的服務提供商(包括公有云提供商AWS、Google、Azure、Ali、Baidu以及Tencent等,以及私有云提供商諧云、靈雀云、博云、才云、DaoCloud以及Rancher等)以及Kubernetes認證的培訓伙伴。

          Provisioning

          有了物理機或虛擬機后,在運行容器化服務之前,需要為容器準備標準化的基礎環(huán)境,這就是Provisioning這一層的作用。在Provisioning這一層中,分為以下幾個功能組成模塊:

          • Automation & Configuration:用于自動化部署和配置容器運行平臺和環(huán)境,代表工具和廠商包括Ansible、Chef、Puppet、VMware以及OpenStack。

          • 容器鏡像庫:容器鏡像庫是整個CNCF云原生中的核心部件之一,因為基于容器的運行環(huán)境中,所有的應用都需要借助容器鏡像庫來進行安裝和部署。容器鏡像庫又分為公有和私有,公有的容器鏡像庫包括docker官方的registry,AWS的Elastic Container Registry,Google的Container Registry等。在私有鏡像庫中,VMware中國團隊主導的Harbor得到了廣泛的應用,大量的容器平臺目前都基于Harbor構(gòu)建其鏡像倉庫。

          • Security & Compliance:Notary和TUF(The Upgrade Framework)是這個領域兩個主要的項目,其中TUF是一個開源的安全標準,Notary是其中一個實現(xiàn)。Notary軟件除了確保軟件的出處外,它還能保證在未經(jīng)容器鏡像提供者批準的情況下,不會在鏡像供應鏈的任何地方修改鏡像內(nèi)的內(nèi)容,從而確保從開發(fā)到運營的過程中,安全都被無縫統(tǒng)一地嵌入到整個工作流中。

          • Key Management:主要用于在整個容器平臺中進行秘鑰管理。


          Runtime

          Runtime這一層可以理解為容器的整個運行環(huán)境,是云原生中最核心的部分,它包括了計算、存儲、網(wǎng)絡三大塊:

          • Container Runtime:Docker是最廣為人知的容器運行環(huán)境,但生產(chǎn)環(huán)境下也有一些其他的容器環(huán)境在運行。Containerd是滿足OCI規(guī)范的核心容器運行時,從設計上就是為了嵌入大型系統(tǒng)的。它由Docker Inc公司啟動,并且在2017年3月份捐贈給了CNCF。此外,CoreOS的RKT是一個用于在Linux上運行應用程序容器的CLI,也可以作為安全、可組合和基于標準的容器虛擬化運行環(huán)境。

          • Cloud-Native Storage:起初,容器為無狀態(tài)的運行單元,容器最上一層文件系統(tǒng)無法保存其在運行時寫入的文件或數(shù)據(jù),容器重建或重啟后,這些寫入的數(shù)據(jù)將丟失。但隨著數(shù)據(jù)庫、消息隊列等中間件逐步在容器環(huán)境中得到應用,如今用戶對容器持久化存儲的理解和需求也更加深入和迫切。

          • Cloud-Native Network:網(wǎng)絡歷來是虛擬化技術中最靈活多變的部分,目前,大多數(shù)客戶使用的主要包括Calico、Flannel、Open vSwitch等方案。


          Orchestration Management

          這一層主要負責容器平臺的編排和調(diào)度,包括服務的發(fā)現(xiàn)和治理,遠程調(diào)用,服務代理,微服務治理等組件,包括:

          • 計劃與編排:在這個領域,Kubernetes是當仁不讓的頭號玩家,目前基于Kubernetes的容器生態(tài)得到了迅速發(fā)展。其它的編排工具還包括Mesos和Docker Swarm等。

          • 協(xié)調(diào)與服務發(fā)現(xiàn):分布式計算中很重要的一點就是各個服務之間的協(xié)同以及服務發(fā)現(xiàn)(或節(jié)點發(fā)現(xiàn)的問題),從老牌的ZooKeeper到近年來在很多互聯(lián)網(wǎng)廠商和應用中流行的Consul(Docker Swarm默認使用),都可以用于分布式服務的發(fā)現(xiàn)和配置,Kubernetes默認使用的則是CoreOS旗下的etcd。

          • 遠程過程調(diào)用:微服務間進行通信,通常有兩種方式,一種是HTTP REST-JSON的方式,另一種為RPC方式,兩者相比,RPC方式效率更高。常用的包括Google開源的GRPC、Apache旗下的Thrift框架、Netflix開源的自帶負載均衡的Ribbon和Avra數(shù)據(jù)序列化框架。


          App Definition and Development

          這一層就是容器平臺上運行的具體應用和工具了,可以理解為容器平臺的應用商店。根據(jù)應用的不同作用的使用場景,可以大致分為以下幾種類型:數(shù)據(jù)庫(例如MySQL、MariaDB、MongoDB、PostgreSQL、Cassandra、TiDB等)、流處理和消息隊列(例如Spark、Storm、RocketMQ、Kafka、RabbitMQ等)、應用和鏡像制作(用于將應用封裝成標準鏡像,使應用能在標準的容器平臺上運行,例如Helm、Docker Composer、Packer等)、CI/CD(最常見的Jenkins、Atlassian公司開發(fā)的Bamboo等)。

          Platform

          從橫向上看,整個云原生還包括眾多的經(jīng)過認證的平臺供應商。

          Observability and Analysis

          這個部分包含了大量用于對平臺進行監(jiān)控(Prometheus、Nagios、Grafana、Zabbix等)、日志(Fluentd、ElasticSearch、Logstash)、以及追蹤(Jaeger)的工具。

          綜上所述,CNCF Landscape全景圖中包含了CNCF社區(qū)成熟或使用范圍較廣、具有最佳實踐的產(chǎn)品和方案供用戶在實際應用中選擇,而且該生態(tài)還在快速發(fā)展中。


          云原生實施路徑


          關于如何實現(xiàn)云原生應用,CNCF給出了比較詳細的利用開源軟件和云原生技術的參考路線圖,如下圖所示:

          圖 5:CNCF云原生技術路線圖

          整個路線圖分成了十個步驟,每個步驟都是用戶或平臺開發(fā)者將云原生技術在實際環(huán)境中落地時,需要循序漸進思考和處理的問題:

          容器化

          目前最流行的容器化技術是Docker,你可以將任意大小的應用程序和依賴項,甚至在模擬器上運行的一些程序,都進行容器化。隨著時間的推移,你還可以對應用程序進行分割,并將未來的功能編寫為微服務。

          CI/CD(持續(xù)集成和持續(xù)發(fā)布)

          創(chuàng)建CI/CD環(huán)境,從而使源代碼上的任意修改,都能夠自動通過容器進行編譯和測試,并被部署到預生產(chǎn)甚至生產(chǎn)環(huán)境中。

          應用編排

          Kubernetes是目前市場上應用編排領域被最廣泛應用的工具,Helm Charts可以用來幫助應用開發(fā)和發(fā)布者用于升級Kubernetes上運行的應用。

          監(jiān)控和分析

          在這一步中,用戶需要為平臺選擇監(jiān)控、日志以及跟蹤的相關工具,例如將Prometheus用于監(jiān)控、Fluentd用于日志、Jaeger用于整個應用調(diào)用鏈的跟蹤。

          服務代理、發(fā)現(xiàn)和治理

          CoreDNS、Envoy和LInkerd可以分別用于服務發(fā)現(xiàn)和服務治理,提供服務的健康檢查、請求路由、和負載均衡等功能。

          網(wǎng)絡

          Calico、Flannel以及Weave Net等軟件用于提供更靈活的網(wǎng)絡功能。

          分布式數(shù)據(jù)庫和存儲

          分布式數(shù)據(jù)庫可以提供更好的彈性和伸縮性能,但同時需要專業(yè)的容器存儲予以支持。

          流和消息處理

          當應用需要比JSON-REST這個模式更高的性能時,可以考慮使用gRPC或者NATS。gRPC是一個通用的RPC(遠程調(diào)用)框架(類似各種框架中的RPC調(diào)用),NATS是一個發(fā)布/訂閱和負載均衡的消息隊列系統(tǒng)。

          容器鏡像庫和運行環(huán)境

          Harbor是目前最受歡迎的容器鏡像庫,同時,你也可以選擇使用不同的容器運行環(huán)境用于運行容器程序。

          軟件發(fā)布

          最后可以借助Notary等軟件用于軟件的安全發(fā)布。

          參考資料:

          1. CNCF云原生定義1.0,github.com/cncf/toc/blob/main/DEFINITION.md

          2. 遷移到云原生應用架構(gòu),Matt Stine著,Jimmy Song譯,jimmysong.io/migrating-to-cloud-native-application-architectures

          3. 云原生全景圖,landscape.cncf.io

          4. CNCN landscape 項目,github.com/cncf/landscape

          5. 持續(xù)演進的Cloud Native - 云原生架構(gòu)下微服務最佳實踐,王啟軍,電子工業(yè)出版社

          6. 暢談云原生,敖小劍,skyao.io/talk/201902-cloudnative-freely-talk

          7. Service Mesh發(fā)展趨勢:云原生中流砥柱,敖小劍,skyao.io/talk/201905-servicemesh-development-trend

          8. 不可變基礎設施,cloud.tencent.com/developer/news/329406

          9. 云原生技術詳解,www.cnblogs.com/sddai/p/13726935.html

          10. 什么是服務網(wǎng)格,jimmysong.io/istio-handbook/concepts/what-is-service-mesh.html

          11. 什么是服務網(wǎng)格,http://www.redhat.com/zh/topics/microservices/what-is-a-service-mesh

          12. 運維的思維升級-不可變基礎設施,wangkai1994.github.io/2019/01/12/Immutable-Infrastructure


          原文鏈接:https://www.freebuf.com/articles/network/269379.html


          程序猿 996 的真實生活!


          36歲程序員應聘被拒引熱議,網(wǎng)友怒了!


          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美AAA在线观看 | 国产成人精品在线视频 | 91香蕉国产视频 | 自拍视频在线81 | 伊人视屏 |